C RECV异步服务器 - 关节

C++ recv asyncronous server-client

本文关键字:关节 服务器 异步 RECV      更新时间:2023-10-16

我正在制作一个基本的聊天程序,我有问题。我想问RECV(插座,BUF,BUFLEN,0)是否在C 中是异步的?我在一段时间内使用它,并且它会阻止循环,直到服务器未将数据发送到客户端。

套筒默认情况下使用阻止I/O 。如果要使用非块I/O ,则必须通过在Windows上使用ioctlsocket(FIONBIO)或在其他平台上使用fcntl(O_NONBLOCK)来明确启用它。然后,I/O操作将在可检测的错误((WSA)EWOULDBLOCKEAGAINEINPROGRESS等)中失败,如果它会阻止呼叫者,因此您可以在以后重复该操作。

另外,您可以使用select()(e)poll()在执行读/写操作之前等待插座处于可读/可读状态。或者,在某些平台上,您可以使用setsockopt()启用SO_RCVTIMEO/SO_SNDTIMEO超时用于阻止读取/写操作。

如果您想要异步I/O 而不是(启动操作,然后在后台完成,然后在完成后通知您),则必须将I/O移动到单独的Worker线程中,或在Windows上,您可以使用一些支持重叠I/O和I/O完成端口的扩展套接字功能(ConnectEx()WSARecv()WSASend()等)。