我可以重用(临时)端口连接到不同的主机吗?

时间:2014-04-25 21:31:35

标签: c sockets network-programming

操作系统可以并且将会重新使用源端口号来连接到不同的目标地址/端口组合吗?

如果我connect()到足够的主机,并保持这些连接打开,最终我将耗尽独特的源端口,耗尽短暂范围,非根范围(1025-65,535;假设非-root)或绝对范围(0-65,535)。我想知道这些是否代表我可以同时连接的主机数量的实际限制。我对标准承诺(或不是)以及Linux上的现实(Windows将是奖金)感兴趣。

我知道打开许多连接可能会遇到许多其他限制;这是一个不同的问题和问题。如果重要,那么大量的连接将在相似的大量进程之间进行划分。我对我要求短暂端口的情况感兴趣,而不是手动bind()。如果在"正常"环境端口不会被重用,有没有办法从用户空间改变这种行为(此时bind()到特定点成为一种选择?)

2 个答案:

答案 0 :(得分:3)

默认情况下,内核不会将任何正在使用的端口重用于临时端口,如果您正在使用64K +并发端口,则可能会导致失败。

您可以使用SO_REUSEADDR套接字选项显式重用端口,并显式绑定到同一端口。这仅在没有端口正在侦听(您无法重用侦听端口),以及将每个套接字连接到不同的远程地址时才有效。

答案 1 :(得分:1)

理论上是的。在练习中没有,因为绑定先于连接,因此它无法看到你连接的内容,所以无法看到4元组是唯一的,所以不会让你重用一个短暂的端口。