Я использую такой способ. Код (Text): /* Функция проверяет заданный промежуток времени возможность чтения из сокета. Если такая возможность не появляется возвращает FALSE*/ BOOL TimeOutRead(ULONG TimeOut, SOCKET Sock) { int rc; fd_set readfd; struct timeval tv; FD_ZERO( &readfd ); FD_SET ( Sock, &readfd ); tv.tv_sec = TimeOut; tv.tv_usec = 0; rc = select( 0, &readfd, NULL, NULL, &tv ); if ( rc <= 0 ) return FALSE; // -1 error, 0 - timeout else if (FD_ISSET(Sock, &readfd)) return TRUE; return FALSE; }
Quark Да, именно. Делаешь цикл, где вызываешь эту функцию, а внутри read(...) с размером твоего буфера, если пришло больше, чем размер твоего буфера, ну или только столько, сколько пришло )
W4FhLF Твой вариант ждет начало прихода данных некоторое время, причем синхронно. Quark спрашивал не совсем об этом.
Xerx Всё-таки select нужно ставить. иначе ioctlsocket(sock, FIONREAD, mayread) часто возвращает mayread = 0, хотя сервер всё ещё передаёт данные. особенно если плохое соединение. Вобщем получилось примерно следующее: Код (Text): unsigned long GetAvailableData(unsigned int h_socket) { unsigned long dw_nread; fd_set fd_read; fd_read.fd_count = 1; fd_read.fd_array[0] = h_socket; if ( select(0,&fd_read,0,0,0) <= 0 ) return 0; ioctlsocket(h_socket,FIONREAD,&dw_nread); return dw_nread; } Если функция возвращает 0 - данных больше нет. Хотел посмотреть как это делают браузеры - не стал разбираться. opera вся упакована.
Quark В вопросе было , соответственно я предложил решение именно этого вопроса. Про код получения всех входящих данных речи не шло ) А так само-собой лучше с select(), я ж не спорю :cool: P.S. Это все, про UNIX-стиль работы с сокетами. Про асинхронный message-based стиль речь, как понимаю, не идет. P.P.S. Исходники Mozilla посмотри. Я в свое время интересовался, вполне читабельно и структурировано. Архив порядка 20МБ, если память не подводит.