2016-12-18 74 views
0

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

回答

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()等)。