Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets UDP:为什么可以';你不是在“连接”后加上“绑定”吗?_Sockets_Udp_Bind_Connect - Fatal编程技术网

Sockets UDP:为什么可以';你不是在“连接”后加上“绑定”吗?

Sockets UDP:为什么可以';你不是在“连接”后加上“绑定”吗?,sockets,udp,bind,connect,Sockets,Udp,Bind,Connect,这很好: 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=

这很好:

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中的一些可以是任意(通配符),在
struct sockaddr_in
中用数字表示为
0
0.0.0
,通常在
netstat
lsof
等中表示。上述
lsof
输出显示指定的4/5个元素,远程端口作为通配符)

我不记得是否应该存在多个套接字,其中一些套接字具有通配符peer addr,而另一些套接字可以是显式的,根据最佳匹配将流量发送到正确的端口

我想试验并检查,当一个应用程序绑定了一个端口而没有指定发送方地址时,另一个应用程序可以连接并绑定对等方,以形成一个更完整的元组。 [请注意,第一个应用程序没有指定
,因此_REUSEADDR
]

p、 美国。有足够点数的人可以创建一个
udp-connect
标签吗?(甚至是udp绑定)

connect(2)
隐式绑定本地端口,因此后续显式
bind(2)
失败

编辑0: 您可以将多个套接字绑定到同一个本地端口,但第一个套接字之后的所有绑定都必须更加具体。比如说,第一个套接字绑定到INADR\u ANY,其他套接字绑定到现有网络接口的特定地址。请注意,所有插座必须设置为
SO\u REUSEADDR

然后是多播,它允许您创建完全重复的套接字绑定,但只针对特定的地址类,您需要做更多的工作来设置它

在我看来,你似乎把这与TCP监听和连接套接字混淆了

编辑1:
connect(2)
还根据到目标的路由修复套接字本地地址。

connect(2)
隐式绑定本地端口,因此后续显式绑定(2)失败

编辑0: 您可以将多个套接字绑定到同一个本地端口,但第一个套接字之后的所有绑定都必须更加具体。比如说,第一个套接字绑定到INADR\u ANY,其他套接字绑定到现有网络接口的特定地址。请注意,所有插座必须设置为
SO\u REUSEADDR

然后是多播,它允许您创建完全重复的套接字绑定,但只针对特定的地址类,您需要做更多的工作来设置它

在我看来,你似乎把这与TCP监听和连接套接字混淆了

编辑1:
connect(2)
还根据到目的地的路由修复套接字本地地址。

如果要获取点(-1),请注释为什么要获取点(-1),然后请注释为什么绑定临时本地端口,因此指定4/5的唯一方法是先绑定,因此,我在最后一段中描述的基本上是不可能的,请确保我没有将其与TCP混为一谈。连接手册页(2):“如果套接字sockfd的类型为SOCK_DGRAM,那么addr是默认情况下数据报发送到的地址,并且是从中接收数据报的唯一地址”是,绑定临时本地端口,因此指定4/5的唯一方法是先绑定,因此,我在最后一段中描述的基本上是不可能的,请确保我没有将其与TCP混为一谈。connect手册页(2):“如果套接字sockfd为SOCK_DGRAM类型,则addr是默认情况下数据报发送到的地址,也是接收数据报的唯一地址”