我可以在有兴趣接受之前将插座留在SYN_RECV吗?



在我编写的种子客户端中,除非我真的想要或需要更多的连接,否则我不接受连接。这导致netstat显示很多SYN_RECV,这似乎是合理的,因为我还没有完成连接。这些是否使用服务器上可用的文件描述符?让积压工作填满直到我真正想要接受是不好的做法吗?有没有更好的做法?

No.连接由 TCP 堆栈完成,可能早在调用accept(),并放置在积压工作队列之前。accept()所做的只是在积压队列为空时阻塞,然后删除头元素并将其作为套接字 FD 返回。它与连接握手没有任何关系。

积压工作队列中的连接不使用文件描述符。FD 按accept().分配

通常,应尽快处理积压工作队列。如果您从不接受积压工作队列中的连接,则当您关闭侦听套接字时,它最终会被重置,这会混淆对等方。与此同时,它一直在消耗对等体的套接字和可能的线程,浪费那里的资源。如果您不想要连接,请接受它并关闭它。

特定平台上的 YMMV。

有没有更好的做法?

接受并立即关闭它们,如果您暂时不想接受处理其他连接。

但是在bittorrent的上下文中,您可能希望实现BEP 40,并且至少执行bittorrent握手以查看连接属于哪个群,以及是否应该放弃现有连接以支持新连接,并且仅在确定其优先级低于现有连接时才关闭连接。

相关内容

  • 没有找到相关文章

最新更新