recv возвращает -1 и errno == EINPROGRESS вызываю select, данные приходят теперь снова recv? Может ли снова произойти то же самое? В общем, как правильно считать данные из неблокирующего сокета?
ээ ну насколько я понял попробуй снова select вызвать=\ судя по её описанию в msdn. сам я с неблокирующими сокетами не работал
Экспериментирую сижу.. неблокирующим делаю сокет только для connect() т.е Код (Text): fcntl( sock, F_SETFL, O_NONBLOCK | ( rc_old = fcntl( sock, F_GETFL, 0 ) ) ); if( connect( sock, ( const struct sockaddr* )&saddr, sizeof( saddr ) ) == 0 || ( errno == EINPROGRESS && SocketReady( sock, SWRITE ) ) ) { fcntl( sock, F_SETFL, rc_old ); ... ( SocketReady - моя обвертка select, SWRITE - флаг ожидания сокета для записи ) Далее посылка и прием данных Код (Text): if( send( sock, req, len, 0 ) > 0 ) { if( recv( sock, buf, MAX_BUF_SIZE, 0 ) > 0 ) { ... recv возвращает -1 и errno == EINPROGRESS Как такое может быть? Сокет ведь не блокирующий, почему он не ожидает завершения приема данных?
Проблему решил. Вызов select должен идти до recv ( это касательно неблокирующего сокета ) А вот с проблемой EINPROGRESS == recv() c блокирующим сокетом нет времени разобраться. Если кто-нибудь разберется при случае - отпишитесь плз. Всем спасибо
А у меня было такое, что recv возвращал -1, а данные все равно приходили Причем небл. режим был включен WSAEventSelect.