【发布时间】:2013-06-01 16:01:08
【问题描述】:
这很好用:
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
setsockopt(4, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(4, {sa_family=AF_INET, sin_port=htons(4444), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
connect(4, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("1.1.1.1")}, 16) = 0
我们可以观察到本地和远程的正确绑定:
$ sudo lsof -Pni :4444
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
udpdup 2815 nhed 4u IPv4 126724 0t0 UDP 10.0.2.15:4444->1.1.1.1:*
但是先连接,绑定的时候报错,为什么?
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
setsockopt(4, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
connect(4, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("1.1.1.1")}, 16) = 0
bind(4, {sa_family=AF_INET, sin_port=htons(4444), sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EINVAL (Invalid argument)
我为什么在乎你问?
我认为接收到的数据包与一个 5 元素元组(proto、loc addr、loc port、rem addr、rem port)匹配。其中 5 个中的一些可以是 ANY(通配符),在 struct sockaddr_in 中用数字表示为 0 或 0.0.0.0,并且通常在 netstat、lsof 等中表示。上面的 lsof 输出显示 4 /5 指定元素,远程端口保留为通配符)
我不记得是否应该存在多个套接字,其中一些具有通配符对等地址,而另一些可能是显式的,根据最佳匹配将流量发送到正确的端口。
我想试验并检查当一个应用程序绑定一个端口而不指定发送者地址时,另一个应用程序可以连接并绑定对等点,以形成一个更完整的元组。
[注意第一个app没有指定SO_REUSEADDR]
附言有足够积分的人可以创建一个udp-connect标签吗? (甚至是 udp 绑定)
【问题讨论】:
-
如果你要拿分(-1)那么请评论为什么