Server/client UDP,发件人使用随机端口
Server/client UDP, sender uses a random port
我正在尝试使用 UDP
套接字做一个简单的 client/server 聊天示例。
想法是在 2 台不同的 PC 上安装 2 个应用程序 运行。每个程序既是客户端又是服务器。
服务器绑定在 0.0.0.0
端口 9999
上,客户端也在使用端口 9999
。
client_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
other_address.sin_family = AF_INET;
other_address.sin_port = htons(9999);
other_address.sin_addr.s_addr = inet_addr(192.168.1.42);
sendto(client_socket, data, size,
0, other_address, sizeof(struct sockaddr_in));
在 Wireshark 上,我可以看到原始端口是从 53783 到 57229 中随机选择的。
Source Destination Protocol Info
192.168.1.6 192.168.1.42 UDP 57229 -> 9999
192.168.1.42 192.168.1.6 UDP 53783 -> 9999
我的错误是什么?
What is my mistake?
如果您希望从您选择的端口发送 UDP 数据包,您需要在发送 UDP 套接字上调用 bind() 以指定您希望套接字连接到的(非零)端口正在发送(并正在收听)。如果您不这样做,那么 OS 将选择一个可用的端口进行发送,如您所见。
请注意,这不一定是坏事:让 OS 为您选择一个端口通常更可取,因为这样可以避免如果您指定的端口是不可用,因为其他一些程序已经在使用它。接收(服务器)程序可以使用 recvfrom() 读取 UDP 数据包以找出它们来自的 IP 地址和端口号,因此即使您的 UDP 数据包不是,它也没有理由不能回复您的 UDP 数据包来自 "well-known" 端口。
我正在尝试使用 UDP
套接字做一个简单的 client/server 聊天示例。
想法是在 2 台不同的 PC 上安装 2 个应用程序 运行。每个程序既是客户端又是服务器。
服务器绑定在 0.0.0.0
端口 9999
上,客户端也在使用端口 9999
。
client_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
other_address.sin_family = AF_INET;
other_address.sin_port = htons(9999);
other_address.sin_addr.s_addr = inet_addr(192.168.1.42);
sendto(client_socket, data, size,
0, other_address, sizeof(struct sockaddr_in));
在 Wireshark 上,我可以看到原始端口是从 53783 到 57229 中随机选择的。
Source Destination Protocol Info
192.168.1.6 192.168.1.42 UDP 57229 -> 9999
192.168.1.42 192.168.1.6 UDP 53783 -> 9999
我的错误是什么?
What is my mistake?
如果您希望从您选择的端口发送 UDP 数据包,您需要在发送 UDP 套接字上调用 bind() 以指定您希望套接字连接到的(非零)端口正在发送(并正在收听)。如果您不这样做,那么 OS 将选择一个可用的端口进行发送,如您所见。
请注意,这不一定是坏事:让 OS 为您选择一个端口通常更可取,因为这样可以避免如果您指定的端口是不可用,因为其他一些程序已经在使用它。接收(服务器)程序可以使用 recvfrom() 读取 UDP 数据包以找出它们来自的 IP 地址和端口号,因此即使您的 UDP 数据包不是,它也没有理由不能回复您的 UDP 数据包来自 "well-known" 端口。