【发布时间】:2009-06-04 01:14:06
【问题描述】:
假设我想在 IPC 的某个端口上运行 TCP/IP 服务。当我将端口号传递给我想要与之通信的进程时,端口号并不重要。获取系统仍然可用的随机、高(通常 > 49152)端口号的最佳方法是什么? POSIX 中有什么我可以使用的吗?
我知道 FTP 服务器经常需要这个。
【问题讨论】:
假设我想在 IPC 的某个端口上运行 TCP/IP 服务。当我将端口号传递给我想要与之通信的进程时,端口号并不重要。获取系统仍然可用的随机、高(通常 > 49152)端口号的最佳方法是什么? POSIX 中有什么我可以使用的吗?
我知道 FTP 服务器经常需要这个。
【问题讨论】:
如果您不指定端口号,操作系统会自动为您选择一个ephemeral port 号码。
新的服务器软件应努力避免依赖于特定的端口号,尤其是当它是用户级软件时,它并非不可避免地绑定到众所周知的端口。幸运的是,这很容易通过请求端口 0 来完成,它会指示系统选择一个临时端口号。
【讨论】:
如果您尝试绑定到端口号 0,系统会将您的套接字绑定到“临时”随机端口。
然后,您可以使用getsockname(在 C 中)获取端口。
在红宝石中:
s = TCPServer.new('localhost', 0) #You can also use nil instead of 0
s.addr[1] #The obtained port number
【讨论】:
您可以使用我的小型 C 库:https://github.com/yegor256/random-tcp-port
编译它并在您的机器上运行。它将输出一个随机可用的 TCP 端口。
【讨论】:
getsockname 获得该端口。但是,如果您关闭套接字,则无法保证旧的临时端口号仍然可用。
唯一的方法是遍历所需的端口范围,尝试一次将一个套接字绑定到每个端口,直到找到一个成功的端口。
【讨论】: