windows - WinSock 最佳 accept() 实践

标签 windows networking sockets winsock

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

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

B > 在我们为当前连接的客户端提供服务之前不接受下一次连接尝试?

大家觉得什么效率最高?

最佳答案

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

一种)

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

  • 二)
  • 如果你不 accept一段时间后的连接(我猜默认是60秒),它将timeout .在正常(或最常见)情况下,这表明服务器过载,因此无法及时响应。但是,如果客户端也是您设计的,请使套接字非阻塞,尝试连接,然后根据需要管理超时。
  • 关于windows - WinSock 最佳 accept() 实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2795663/

    相关文章:

    c++ - 非阻塞套接字和 send()

    Windows 批处理文件 : PID of last process?

    c++ - Linux C++ : Accessing network statistics

    c++ - 选择监听套接字总是成功

    java - 通过 Java 发送电子邮件 - javax.mail.MessagingException : Could not connect to SMTP host: localhost, port: 587;

    android - 无法使用库莱布拉

    windows - 当在经典模式下配置的应用程序池中调用 Response.Flush 时,IIS 10 从 HTTP/2 切换到 HTTP/1.1

    python - 将十进制转换为十六进制python

    c++ - 通过 Winsocks 发送一个 int 数组

    javascript - Socket.io channel 和消息回调