C++ recv 异步服务器-客户端

C++ recv asyncronous server-client

我正在制作一个基本的聊天程序,但遇到了问题。 我想问一下recv(socket, buf, buflen, 0) 在c++中是异步的吗?我在 while 循环中使用它,它会阻塞循环,直到服务器不向客户端发送数据。

套接字默认使用阻塞I/O。如果你想使用非阻塞I/O,你必须通过在其他平台上使用ioctlsocket(FIONBIO) on Windows, or fcntl(O_NONBLOCK)来显式启用它。如果 I/O 操作会阻止调用者,则操作将失败并出现可检测到的错误((WSA)EWOULDBLOCKEAGAINEINPROGRESS 等),因此您可以稍后重复该操作时间。

或者,您可以使用 select()(e)poll() 等待套接字处于 readable/writable 状态,然后再执行 read/write 操作,否则会阻塞。或者,在某些平台上,您可以使用 setsockopt() 启用 SO_RCVTIMEO/SO_SNDTIMEO 超时以阻止 reads/write 操作。

如果您想要 异步 I/O(启动一个操作并在后台完成,然后在完成时通知您),您必须移动 I/O 到单独的工作线程,或者在 Windows 上,您可以使用一些支持重叠 I/O 和 I/O 完成端口的扩展套接字函数(ConnectEx(), WSARecv(), WSASend() 等)。