9

假设我想在 IPC 的某个端口上运行 TCP/IP 服务。当我将端口号传递给我想要与之通信的进程时,端口号并不重要。获取系统仍然可用的随机、高(通常 > 49152)端口号的最佳方法是什么?POSIX中有什么我可以使用的吗?

我知道 FTP 服务器经常需要这个。

4

5 回答 5

14

如果您不指定端口号,操作系统将自动为您选择一个临时端口号。

选择端口号

新的服务器软件应该努力避免依赖于特定的端口号,尤其是如果它是用户级软件,并且没有不可避免地绑定到一个众所周知的端口。幸运的是,这很容易通过请求端口 0 来完成,它指示系统选择一个临时端口号。

于 2009-06-04T01:20:42.787 回答
6

临时端口可以做到这一点。您的操作系统会从空闲端口池中为您分配一个端口。

有一些 C 代码,BSD 许可,在此处执行此操作

在 Python 中,您可以('', 0)为相同的目的指定一个 socket.AF_INET 地址对,例如sock.bind(('', 0))

于 2009-06-04T01:40:02.247 回答
2

如果您尝试绑定到端口号 0,系统会将您的套接字绑定到“临时”随机端口。然后,您可以使用getsockname(在 C 中)获取端口。

在红宝石中:

s = TCPServer.new('localhost', 0) #You can also use nil instead of 0
s.addr[1] #The obtained port number
于 2015-05-08T09:10:31.410 回答
-1

你可以使用我的小型 C 库:https ://github.com/yegor256/random-tcp-port

编译它并在你的机器上运行。它将输出一个随机可用的 TCP 端口。

于 2014-07-20T11:12:43.880 回答
-9

唯一的方法是遍历所需的端口范围,尝试一次将一个套接字绑定到每个端口,直到找到一个成功的端口。

于 2009-06-04T01:18:26.287 回答