WinSock最好接受()的做法

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

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

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

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

在这里,我描述了我所知道的两个选项的缺点。 希望这可能会帮助你决定。

一个)

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

B)

  • 如果您在一段时间后不接受连接(我猜默认是60秒),它会超时 。 在正常(或最常见)的情况下,这表明服务器已经过载,从而无法及时回答。 但是,如果客户端也是由您设计的,请使套接字非阻塞,尝试连接,然后根据需要管理超时。

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