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