2016-12-18 9 views
0

Я делаю базовую программу чата, и у меня есть проблема. Я хотел спросить, является ли recv (socket, buf, buflen, 0) асинхронным в C++? Я использую его в цикле while и блокирует цикл до тех пор, пока сервер не отправит данные клиенту.C++ recv asyncronous server-client

ответ

0

Сокет использует блокирующий ввод-вывод по умолчанию. Если вы хотите использовать неблокирующий ввод-вывод , вы должны явно включить его, используя ioctlsocket(FIONBIO) на Windows или fcntl(O_NONBLOCK) на других платформах. Операции ввода-вывода будут сбой с обнаруженной ошибкой ((WSA)EWOULDBLOCK, EAGAIN, EINPROGRESS и т. Д.), Если он заблокирует вызывающего абонента, поэтому вы можете повторить операцию позднее.

В качестве альтернативы вы можете использовать select() или (e)poll(), чтобы дождаться, когда сокет будет находиться в состоянии чтения/записи перед выполнением операции чтения/записи, которая в противном случае блокируется. Или, на некоторых платформах, вы можете использовать setsockopt(), чтобы включить SO_RCVTIMEO/SO_SNDTIMEO таймауты для блокировки операций чтения/записи.

Если вы хотите асинхронного ввода/вывода вместо (начать операцию и завершается в фоновом режиме и уведомляет вас, когда закончил), вы должны либо переместить ввода/вывода в отдельном потоке, или на Windows, вы можете использовать некоторые расширенные функции сокетов (ConnectEx(), WSARecv(), WSASend() и т. д.), которые поддерживают переполненные порты ввода-вывода и ввода-вывода.