假设我有一个服务器程序可以接受来自 10 个(或更多)不同客户端的连接。客户端随机发送数据,服务器接收到这些数据,但可以肯定的是,每次更新都会至少有一个客户端发送数据。服务器不能等待信息到达,因为它还有其他处理要做。除了使用异步套接字之外,我还看到了两个选项:
使所有套接字不阻塞。在一个循环中,调用
recv()
每个套接字并允许它失败,WSAEWOULDBLOCK
如果没有可用的数据并且如果我碰巧得到了一些数据,那么保留它。让套接字保持阻塞状态。将所有套接字添加到 a
FD_SET
并调用select()
. 如果返回值不为零(大多数情况下是这样),则循环遍历所有套接字以找到适当数量的可读套接字,FD_ISSET()
并仅调用recv()
可读套接字。
第一个选项将创建更多对该recv()
函数的调用。第二种方法从编程的角度来看是一个更大的痛苦,因为所有的FD_SET
和FD_ISSET
循环。
首选哪种方法(或另一种方法)?是否避免让recv()
非阻塞套接字失败的开销值得调用的麻烦select()
?
我想我理解这两种方法,并且我都成功地尝试过,但我不知道一种方法是否被认为更好或最优。