Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.06;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.038 c
4-1113407396
Klopan
2005-04-13 19:49
2005.06.06
Как поймать WM_SYSCOMMAND в системе?


14-1116490035
Piter
2005-05-19 12:07
2005.06.06
Трубы из металлопластика, 15 мм


14-1116715261
KilkennyCat
2005-05-22 02:41
2005.06.06
Просто замечательная ссылка. .математика, программирование и пр.


3-1114666775
Sergun
2005-04-28 09:39
2005.06.06
сортировка записей в DbGridEh


6-1111468533
atruhin
2005-03-22 08:15
2005.06.06
FD_CLOSE и оставшиеся в буфере данные.