假设我想在IPC的某个端口上运行TCP / IP服务。当我将端口号传递给我想要与之通信的进程时,端口号无关紧要。获得系统仍然可用的随机,高(通常> 49152)端口号的最佳方法是什么?我可以使用POSIX中的东西吗?
我知道FTP服务器经常需要这个。
答案 0 :(得分:13)
如果您没有指定端口号,操作系统会自动为您选择ephemeral port号码。
新的服务器软件应努力避免依赖于特定的端口号,特别是如果它是用户级软件并非不可避免地与众所周知的端口绑定。幸运的是,通过请求端口0可以轻松完成此操作,端口0指示系统选择短暂的端口号。
答案 1 :(得分:5)
短暂的端口可以做到这一点。您的操作系统将为您分配空闲端口池中的端口。
有一些C代码,BSD许可,执行此操作here
在Python中,您可以为同一目的指定('', 0)
socket.AF_INET地址对,例如sock.bind(('', 0))
答案 2 :(得分:1)
如果您尝试绑定到端口号0,系统会将您的套接字绑定到" ephemereal"随机端口。
然后,您可以使用getsockname
(在C中)获取端口。
在红宝石中:
s = TCPServer.new('localhost', 0) #You can also use nil instead of 0
s.addr[1] #The obtained port number
答案 3 :(得分:0)
您可以使用我的小型C库:https://github.com/yegor256/random-tcp-port
编译并在您的计算机上运行。它将输出一个随机的TCP端口。
答案 4 :(得分:-9)
唯一的方法是遍历所需的端口范围,尝试将套接字一次绑定到每个端口,直到找到一个成功的端口。