Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как насильно завершить соединения TIdTCPServer [D7, WinXP]


pirat ©   (2004-03-18 23:58:00) 

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


Digitman   (2004-03-22 11:22:00) [1]


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


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


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

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


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-19 10:58:00) [3]

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

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

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


pirat   (2004-03-19 10:26:00) [4]

ээээ .. чего то я не совсем понимаю какие именно обработчики и как нужно описать.
Все время валится вот сюда
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 08:39:00) [5]

IdTCPServer.Active := false;

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо