在我编写的种子客户端中,除非我真的想要或需要更多的连接,否则我不接受连接。这导致netstat
显示很多SYN_RECV
,这似乎是合理的,因为我还没有完成连接。这些是否使用服务器上可用的文件描述符?让积压工作填满直到我真正想要接受是不好的做法吗?有没有更好的做法?
No.连接由 TCP 堆栈完成,可能早在调用accept(),
并放置在积压工作队列之前。accept()
所做的只是在积压队列为空时阻塞,然后删除头元素并将其作为套接字 FD 返回。它与连接握手没有任何关系。
积压工作队列中的连接不使用文件描述符。FD 按accept().
分配
通常,应尽快处理积压工作队列。如果您从不接受积压工作队列中的连接,则当您关闭侦听套接字时,它最终会被重置,这会混淆对等方。与此同时,它一直在消耗对等体的套接字和可能的线程,浪费那里的资源。如果您不想要连接,请接受它并关闭它。
特定平台上的 YMMV。
有没有更好的做法?
接受并立即关闭它们,如果您暂时不想接受处理其他连接。
但是在bittorrent的上下文中,您可能希望实现BEP 40,并且至少执行bittorrent握手以查看连接属于哪个群,以及是否应该放弃现有连接以支持新连接,并且仅在确定其优先级低于现有连接时才关闭连接。