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