Я делаю базовую программу чата, и у меня есть проблема. Я хотел спросить, является ли recv (socket, buf, buflen, 0) асинхронным в C++? Я использую его в цикле while и блокирует цикл до тех пор, пока сервер не отправит данные клиенту.C++ recv asyncronous server-client
ответ
Сокет использует блокирующий ввод-вывод по умолчанию. Если вы хотите использовать неблокирующий ввод-вывод , вы должны явно включить его, используя ioctlsocket(FIONBIO)
на Windows или fcntl(O_NONBLOCK)
на других платформах. Операции ввода-вывода будут сбой с обнаруженной ошибкой ((WSA)EWOULDBLOCK
, EAGAIN
, EINPROGRESS
и т. Д.), Если он заблокирует вызывающего абонента, поэтому вы можете повторить операцию позднее.
В качестве альтернативы вы можете использовать select()
или (e)poll()
, чтобы дождаться, когда сокет будет находиться в состоянии чтения/записи перед выполнением операции чтения/записи, которая в противном случае блокируется. Или, на некоторых платформах, вы можете использовать setsockopt()
, чтобы включить SO_RCVTIMEO
/SO_SNDTIMEO
таймауты для блокировки операций чтения/записи.
Если вы хотите асинхронного ввода/вывода вместо (начать операцию и завершается в фоновом режиме и уведомляет вас, когда закончил), вы должны либо переместить ввода/вывода в отдельном потоке, или на Windows, вы можете использовать некоторые расширенные функции сокетов (ConnectEx()
, WSARecv()
, WSASend()
и т. д.), которые поддерживают переполненные порты ввода-вывода и ввода-вывода.