2011-05-12 27 views
3

如果您拨打DRb.start_service(nil, some_obj),然后拨打DRb.uri,您将获得本地URI(包括端口号),以便另一个进程可用来拨打电话。如何在Ruby中找到随机打开的端口?

我正在寻找只是有一些代码找到一个随机可用端口并返回该端口号,而不是启动一个成熟的DRb服务。有没有一种简单的方法来在Ruby中做到这一点?

+0

你应该将答案标记为接受.. :) – Trevoke 2012-02-13 16:58:30

回答

18

还没有尝试过,但这可能工作。

http://wiki.tcl.tk/2230

的方法可以让系统 自动分配的端口。对于
互联网域和XNS 域,在调用bind()之前指定端口号为 0要求 系统执行此操作。

另见http://www.ruby-doc.org/stdlib/libdoc/socket/rdoc/classes/Socket.html#M003723

require 'socket' 

# use Addrinfo 
socket = Socket.new(:INET, :STREAM, 0) 
socket.bind(Addrinfo.tcp("127.0.0.1", 0)) 
p socket.local_address #=> #<Addrinfo: 127.0.0.1:2222 TCP> 

注意在socket.bind呼叫使用端口0。预期的行为是local_address将包含随机打开的端口。

+0

这应该是公认的答案!谢谢。我确实需要什么。 – Trevoke 2012-02-13 16:58:39

+0

建议!这在'rbx-2.5.2'下不起作用......'Addrinfo'无处可寻。 – digitalextremist 2015-06-06 03:25:34