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" 端口。