Натолкнулся тут на одну проблемку, сводившую меня с ума несколько часов, пока все же не отловил эту гадость. Даже не знаю фича это или все же баг.
Есть ТСПшный сервер, который при коннекте клиента, создает для него поток, который крутится и обрабатывает запросы клиента до тех пор, пока клиент не отключится. Идет взаимный обмен данными, но потом от клиента может не поступать инфы довольно продолжительное время. Отключаться нельзя, поэтому соединение остается активным.
Проблема заключается в том, что если во время простоя клиент отвалится, то никакого сообщения, ошибки сокета или статусного события не происходит до тех пор, пока не будет попытки писать в сокет. И несмотря на то, что клиент уже отвалился, умер и погребен, поток продолжает крутиться, продолжает запрашивать инфу из сокета, тот ему отвечает, что инфы нет, но все нормально.. работай чувак.
Теперь вопрос, это нормальное поведение синапса или баг? Или я где-то накосячил?
Если нормальное, то есть ли более адекватные методы запроса состояния сокета, кроме регулярной отправки некоего пингового сообщения, чисто для определения состояния сокета? Подскажите, плз, т.к. лыжи уже не едут.
Все выглядит примерно так:
- Код: Выделить всё
while not Terminated do begin
vRecvSockStr:='';
//если есть инфа в буфере, то читаем
if Sock.WaitingData>0 then begin
vRecvSockStr := Sock.RecvPacket(2000);
Self.AddLog('Сервер прочитал сообщение:'+vRecvSockStr);
end;
//Обработка ошибок сокета
if Sock.LastError<>0 then begin
AddLog(inttostr(Sock.LastError)+':'+sock.GetErrorDescEx);
break;
end;
sleep(100);
//!!!!!!!!!!!!!!!!!!!!!!!
//дисконект заработает, если включить отсылку сообщения клиенту
//Sock.SendString('ping');
end;