我正在制作一个基本的聊天程序而且我有一个问题。 我想问一下recv(socket,buf,buflen,0)在c ++中是否是异步的?我在while循环中使用它并阻止循环,直到服务器不向客户端发送数据。
答案 0 :(得分:0)
套接字默认使用阻止I / O 。如果您要使用非阻止I / O ,则必须在Windows上使用ioctlsocket(FIONBIO)
或在其他平台上使用fcntl(O_NONBLOCK)
明确启用它。如果I / O操作会阻塞调用者,那么I / O操作将失败并显示可检测的错误((WSA)EWOULDBLOCK
,EAGAIN
,EINPROGRESS
等),因此您可以稍后重复该操作。
或者,您可以使用select()
或(e)poll()
在执行读取/写入操作之前等待套接字处于可读/可写状态,否则将阻止该操作。或者,在某些平台上,您可以使用setsockopt()
启用SO_RCVTIMEO
/ SO_SNDTIMEO
超时来阻止读/写操作。
如果您想要异步I / O (启动操作并在后台完成操作,然后在完成时通知您),则必须将I / O移动到单独的工作线程或者在Windows上,您可以使用一些支持重叠I / O和I / O完成端口的扩展套接字函数(ConnectEx()
,WSARecv()
,WSASend()
等)。