Вниз
Скачать: CL | DM;

как насильно завершить соединения TIdTCPServer   Найти похожие ветки 

 
pirat ©   (2004-03-18 23:58) [0]

подскажите плз как насильно закрыть соединения TIdTCPServer не из его обработчика ? А то все время исключение вылезает при выходе :(


 
Digitman ©   (2004-03-19 08:39) [1]

IdTCPServer.Active := false;

если алгоритмы обработчиков событий объектов в составе IdTCPServer"а корректны, то никаких проблем быть не должно


 
pirat ©   (2004-03-19 10:26) [2]

ээээ .. чего то я не совсем понимаю какие именно обработчики и как нужно описать.
Все время валится вот сюда
function TIdIOHandlerSocket.Recv(var ABuf; ALen: integer): integer;
begin
 if Connected then
 begin
   Result := Binding.Recv(ABuf, ALen, 0);
 end
 else begin
   raise EIdClosedSocket.Create(RSStatusDisconnected);
 end;
end;

типа  пытается что то принять когда соединения уже нету ?


 
Digitman ©   (2004-03-19 10:58) [3]

ну да, разумеется ..

значит, где-то в коде одного из обработчиков (например, в OnExecute) уже после того, как Connected станет False (это как раз происходит при деактивации сервера), ты не проанализировав активность соединения пытаешься что-то читать из гнезда

приводи исх.тексты тех обработчиков, которые ты используешь


 
pirat ©   (2004-03-20 00:12) [4]

конечно примитивно, но я тока учусь :)


procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var i : integer;
begin
if AThread.Connection.IOHandler.Connected then begin
   case State of
    waitLogin :
       begin
         ClientLogin := AThread.Connection.InputLn("",false);
            AThread.Connection.WriteLn("Password");
            State := waitPassword;
       end;

       waitPassword:
       begin
        ClientPassword := AThread.Connection.InputLn("",false);
           if TestLogPass then begin
            AThread.Connection.WriteLn("Access Granted");
               State := waitCommand;
           end else begin
            AThread.Connection.WriteLn("Access Denied");
               State := null;
               AThread.Connection.DisconnectSocket;
           end;
       end;

       waitCommand:
       begin
        ClientCommand := AThread.Connection.InputLn("",false);
           if ClientCommand = "GetCountState" then
            AThread.Connection.WriteLn(ClientsList.Items[ClientRecNo].SubItems[1])
           else if pos("GetMoney",ClientCommand)<>0 then begin
            i := PosEx("GetMoney",ClientCommand,0);
               i := PosEx("=",ClientCommand,i) + 1;
               AThread.Connection.WriteLn(copy(ClientCommand, i, length(ClientCommand)-i + 1));
           end else
           if ClientCommand = "Logout" then
            AThread.Connection.DisconnectSocket;

       end;
   end;
   end else
    State := null;
end;


то есть, например, если посмотреть на call stack то исключение вылезает на ClientLogin := AThread.Connection.InputLn("",false);
то есть как я понимаю оно тормозит поток и ждет данных, а в это время сервер насильно вырубают...  а как тогда узнать пришли ли вообще какие нить данные ???


 
Digitman ©   (2004-03-22 11:22) [5]


> а как тогда узнать пришли ли вообще какие нить данные


а зачем ? сеанс инф.обмена с клиентом уже прерван



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.027 c
14-1080143655
Piter
2004-03-24 18:54
2004.04.11
FAQ: Добавление иконки в SysTray


3-1081507342
Homer
2004-04-09 14:42
2004.04.11
Синхронизация.


14-1082358614
Семен Сорокин
2004-04-19 11:10
2004.04.11
ненужная WINDOWS :)


14-1079392286
Canon
2004-03-16 02:11
2004.04.11
Антихрист еще не явился, а печати уже ставят!


3-1081430583
CJ
2004-04-08 17:23
2004.04.11
MIDAS, applyupdates




   Наверх