Re[4]: CAsyncSocket&Receive
От: zaxs  
Дата: 11.06.04 10:40
Оценка:
Здравствуйте, butcher, Вы писали:

B>WSAEWOULDBLOCK означает, что операция ввода/вывода требует блокировки для удачного завершения, другими словами в данный момент система не готова вам отдать данные. Когда вы в дебагере принмаете, то между каждым вызовом recv система успевает принять данные, обработать их соответсвующим образом и отдать вам.

B>Что делать вам: вам нужно изменить алгоритм приёма, т.е. читать данные до ошибки WSAEWOULDBLOCK, потом ждать следующего FD_READ и читать дальше, в случае возниконовения другой ошибки обрабатывать её соответствующим образом.

Точно так. Стормозил и неправильно понял МСДН — библию программиста . Т.е. проблема решаема. Спасибо. Только я вот почитал ответ от "Maxim S. Shatskih" и сделал аналогичный пример, но на блокирующих сокетах без использования МФС. Там действительно не нужно делать Sleep. Вот как выглядит последний самый интересный кусок кода:
////////////////////////////////////////////////////////
CStdioFile zaxs;
zaxs.Open("letter",CFile::modeCreate|CFile::modeWrite);

while(bait>0)
{
bait=recv (srv_socket , szBuf, 65536, 0);
zaxs.Write(szBuf,bait);
}
zaxs.Close();
AfxMessageBox("файл скачан");
closesocket (srv_socket);
/////////////////////////////////////////////////////////////////
Т.е. принимает она нормально, но до поры до времени — пока данные не кончатся, а потом тормоза... В принципе как в теме CAcyncSocket&recv указано, можно через list узнать сколько байт точно нужно читать, но решение честно говоря некрасивое. Неужели нет другого выхода???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.