Форум: "Сети";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
ВнизFD_CLOSE и оставшиеся в буфере данные. Найти похожие ветки
← →
atruhin © (2005-03-22 08:15) [0]Создаю событие FD_READ or FD_CLOSE, ожидаю, обробатываю. Столкнулся с тем, что если сервер отпровляет данные и закрывает сокет, я получаю оба события, и на FD_CLOSE приходиться определять не остались ли еще данные во входном буфере IOCtlSocket и вычитывать их перед завершением работы потока.
Как это сделать лучше?
WSAEventSelect(InternalSocket, Hs[1], FD_READ or FD_CLOSE); // WaitResult := WaitForMultipleObjects(EvCount, @Hs[0], false, AliveTimeout);
case WaitResult of
WAIT_OBJECT_0 + 1 : begin
WSAEnumNetworkEvents(ExternalSocket, Hs[2], @NetworkEvents);
if NetworkEvents.lNetworkEvents and FD_Read>0 then
if NetworkEvents.iErrorCode[FD_Read_Bit]=0 then begin // DataRead(ExternalSocket, ExternalData, ExternalLen);
end else break;
if NetworkEvents.lNetworkEvents and FD_Close>0 then begin
IOCtlSocket(ExternalSocket, FIONRead, arg);
while arg > 0 do begin
DataRead(ExternalSocket, ExternalData, ExternalLen);
IOCtlSocket(ExternalSocket, FIONRead, arg);
end;
break;
end;
← →
Verg © (2005-03-22 09:22) [1]Так и делай, а в чем вопрос? "Лучше" - это мутный какой-то термин.
Можно и просто читать пока recv (DataRead) не вернет <=0 прочитанных данных. Сокет неблокирующий, поэтому, в принципе можно не делать проверок FIONREAD.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.012 c