Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

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

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

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


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

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


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

IdTCPServer.Active := false;

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


 
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;

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


 
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 (это как раз происходит при деактивации сервера), ты не проанализировав активность соединения пытаешься что-то читать из гнезда

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


 
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);
то есть как я понимаю оно тормозит поток и ждет данных, а в это время сервер насильно вырубают...  а как тогда узнать пришли ли вообще какие нить данные ???


 
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]


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


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


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


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


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



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

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.038 c
3-1081528134
iov13
2004-04-09 20:28
2004.05.09
MSSQL &amp; ADO


14-1081966152
Liona
2004-04-14 22:09
2004.05.09
А такие как админы этого форума - тут есть?


1-1082375157
wicked
2004-04-19 15:45
2004.05.09
virtual vs не-virtual


14-1082174736
dosik
2004-04-17 08:05
2004.05.09
ATI Radeon 9600XT для Linux


7-1079895576
Gun Expert
2004-03-21 21:59
2004.05.09
Чтение нестандартного значения реестра из Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский