在 Ruby 中将 UDP 套接字绑定到通配符主机

Posted

技术标签:

【中文标题】在 Ruby 中将 UDP 套接字绑定到通配符主机【英文标题】:Binding a UDP socket to wildcard hosts in Ruby 【发布时间】:2015-03-18 13:39:32 【问题描述】:

我一直试图理解 UDP 打孔背后的基本思想,但我无法理解以下两个套接字绑定之间的区别:

 sock = UDPSocket.new
 sock.bind('', port ) 

sock = UDPSocket.new
sock.bind('0.0.0.0', port)

以前我曾认为使用 '' 或 '0.0.0.0' 会做同样的事情——允许套接字在任何网络接口上侦听——但由于代码不能与它们互换,所以我一定遗漏了一些东西。

对于初始“punch”,数据报从绑定到“”的套接字发送,然后关闭该套接字,并通过绑定到 0.0.0.0 的套接字完成与远程主机的实际通信。我知道 0.0.0.0 通常是指默认路由,但在这种情况下我无法弄清楚它的意义。将套接字绑定到 0.0.0.0 是否意味着您正在为其分配默认网关的地址?

【问题讨论】:

【参考方案1】:

看起来两者都提供相同的行为:您的套接字正在侦听给定端口上的所有接口:

ruby      38156 grych    7u  IPv4 0x40a92a845129cab1      0t0  UDP *:6666

我的系统是 Darwin 14.0 (OS X Mavericks),ruby 2.0.0 - 我想知道它是否依赖于操作系统。

【讨论】:

以上是关于在 Ruby 中将 UDP 套接字绑定到通配符主机的主要内容,如果未能解决你的问题,请参考以下文章

udp 套接字发送到隐式绑定

在 node.js 中,如何创建一个自动绑定到可用端口的 UDP 套接字?

UDP Socket:一个现有的连接被远程主机强行关闭

TCP与UDP的区别

使用 C 绑定到 IOCP 的 UDP 套接字

UDP通讯