C ++ recv asyncronous服务器 - 客户端

时间:2016-12-18 18:09:01

标签: c++ server client chat

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

1 个答案:

答案 0 :(得分:0)

套接字默认使用阻止I / O 。如果您要使用非阻止I / O ,则必须在Windows上使用ioctlsocket(FIONBIO)或在其他平台上使用fcntl(O_NONBLOCK)明确启用它。如果I / O操作会阻塞调用者,那么I / O操作将失败并显示可检测的错误((WSA)EWOULDBLOCKEAGAINEINPROGRESS等),因此您可以稍后重复该操作。

或者,您可以使用select()(e)poll()在执行读取/写入操作之前等待套接字处于可读/可写状态,否则将阻止该操作。或者,在某些平台上,您可以使用setsockopt()启用SO_RCVTIMEO / SO_SNDTIMEO超时来阻止读/写操作。

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