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)EWOULDBLOCK
、EAGAIN
、EINPROGRESS
等),因此您可以稍后重复该操作时间。
或者,您可以使用 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()
等)。
我正在制作一个基本的聊天程序,但遇到了问题。 我想问一下recv(socket, buf, buflen, 0) 在c++中是异步的吗?我在 while 循环中使用它,它会阻塞循环,直到服务器不向客户端发送数据。
套接字默认使用阻塞I/O。如果你想使用非阻塞I/O,你必须通过在其他平台上使用ioctlsocket(FIONBIO)
on Windows, or fcntl(O_NONBLOCK)
来显式启用它。如果 I/O 操作会阻止调用者,则操作将失败并出现可检测到的错误((WSA)EWOULDBLOCK
、EAGAIN
、EINPROGRESS
等),因此您可以稍后重复该操作时间。
或者,您可以使用 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()
等)。