Вниз
Скачать: 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.028 c
1-1082432044
oleg_v
2004-04-20 07:34
2004.04.11
приложение под WIN 3.1


1-1082459605
gauss
2004-04-20 15:13
2004.04.11
Помогите... Регистрация СОМ объекта


6-1079346465
Aleksandr
2004-03-15 13:27
2004.04.11
Что быстрее в рассылке электронной почты?


4-1079858504
tytus
2004-03-21 11:41
2004.04.11
Как перехватить сообщения WM_VSCROLL и WM_HSCROLL?


4-1075829258
sergey1
2004-02-03 20:27
2004.04.11
ListView в чужом окне.




   Наверх