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