К списку форумов К списку вопросов
Еще немного о сокетах
SBoyko
29.04.2004 - 15:38
Вот столкнулся недавно с таким косячком-с.
Скорее всего я туплю, но... неужели сервер никак не может определить момент разрыва соединения со стороны клиента?
Подробнее:
   TCommonServerThread = class(TServerClientThread)
   private
      FSocketStream : TWinSocketStream;
   public
      procedure ClientExecute; override;
      //to sync with VCL
      procedure UpdateList;
end;
procedure TCommonServerThread.ClientExecute;
....
         while ( not Terminated ) and ( ClientSocket.Connected ) do
            try
               FillChar(Buff,BUF_SIZE,0);
               Sleep(100);
               if FSocketStream.Read(Buff, BUF_SIZE) = 0 then Continue;
               if Buff = 'exit' then Terminate;
               Synchronize(UpdateList);
            except
               on e:Exception do
               begin
                  ClientSocket.Close;
                  Terminate;
               end;
            end;
.....
Так вот вопрос: неужели сервер может разорвать соединение только в случае прихода запроса на отключение клиента (строка "exit") и в случае если сам захочет этого (ClientSocket.Close & Terminate ) ??????
Никак не могу найти и обработать событие на отсоединение клиента и, естественно, совершить убийство потока.
SBoyko
1 - 30.04.2004 - 22:15
up
Никто не сталкивался или вопрос слишком глуп ? ;)
Delphist
2 - 01.05.2004 - 00:56
ИМХО, никак. Если клиент не говорит серверу "до свидания", сервер будет ждать тайм-аута. Ведь это выглядит как пауза со стороны клиента.
Manfred
3 - 01.05.2004 - 09:32
Я что-то не догоняю: а событие OnClientDisconnect на что? Или я неправильно понял задачу?
нонейм
4 - 02.05.2004 - 19:26
Согласен с <2>. Сервер просто физически не может определить отваливание клиента без периодического обращения к нему.
3: это событие как раз на случай, когда клиент сам честно признается что он отваливается. Если клиент молча умирает, сервер бессилен отловить это событие.
ste
5 - 03.05.2004 - 09:26
Если клиент падает и не закрывает сокет, тогда сервер, конечно, не знает об этом. Но если клиент закрыл сокет, то сервер это видит.
SBoyko
6 - 10.05.2004 - 21:38
Спасибо всем за ответы.
SBoyko
7 - 10.05.2004 - 21:41
OFFTOP: Классный все-таки город Краснодар. Только только из командировки оттуда вернулся ;))

К списку вопросов на форуме Программирование

>>