Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

как насильно завершить соединения 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.033 c
1-1082730530
windows
2004-04-23 18:28
2004.05.09
как edit у послать сообщение что его редактируют (Edit1Change)


14-1082007907
BaDeVlad
2004-04-15 09:45
2004.05.09
Кто хочет протестировать блокнотик


9-1071347569
Sergio
2003-12-13 23:32
2004.05.09
Картинка исчезает!


14-1082159189
juiceman
2004-04-17 03:46
2004.05.09
Программирование в Delphi глазами хакера (с CD-ROM)


3-1081621962
Rosik
2004-04-10 22:32
2004.05.09
Подскажите пожалуйста! Как в DBgrid в title картинку вставить





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский