Главная страница
    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.037 c
8-1076566297
disciple
2004-02-12 09:11
2004.05.09
Компоненты TrackBar и MediaPlayer


1-1082484754
s666
2004-04-20 22:12
2004.05.09
Как совместить два типа PChar и String


3-1081767131
innok
2004-04-12 14:52
2004.05.09
access через Ado


6-1079469283
Олег
2004-03-16 23:34
2004.05.09
Socket или нет что лучше?


4-1079342031
Aleksandr
2004-03-15 12:13
2004.05.09
Как по полученному мьютексу вывести приложение вперед?





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