WinSock最好接受()做法

时间:2010-05-08 21:17:45

标签: windows networking sockets winsock

想象一下,你有一台服务器,一次只能处理一个客户端。服务器使用WSAAsyncSelect通知新连接。在这种情况下,处理FD_ACCEPT消息的最佳方法是什么:

A>立即接受连接尝试,但将客户端排队直到轮到它?

B>在完成为当前连接的客户端提供服务之前,不要接受下一次连接尝试吗?

你们认为最有效率的是什么?

2 个答案:

答案 0 :(得分:1)

问问自己:您希望用户体验在另一端?你想让他们被卡住吗?你想让他们超时吗?你想让他们得到礼貌的信息吗?

答案 1 :(得分:1)

在这里,我描述了我对两种选择都知道的缺点。希望这可以帮助您做出决定。

A)

  • 在新客户端连接时,它可能会发送大量数据,使您的接收缓冲区变满,从而导致不必要的数据包被传输(请参阅this)。如果您不打算从客户端接收任何数据,shutdown在该套接字上接收,那么如果客户端在此之后发送任何数据,则重置连接。此外,如果您的协议有严格的规则,请断开客户端连接。
  • 如果连接闲置时间过长,系统可能会断开连接。要解决此问题,请使用setsockopt在每个客户端套接字上设置SO_KEEPALIVE

B)

  • 如果您在一段时间后没有accept连接(我猜默认值是60秒),它将timeout。在正常(或最常见)情况下,这表示服务器过载,因此无法及时应答。但是,如果客户端也是由您设计的,请使套接字无阻塞,尝试连接,然后根据需要管理超时。