服务器/客户端UDP,发件人使用随机端口

时间:2016-05-19 19:54:16

标签: c sockets udp port

我正在尝试使用UDP套接字做一个简单的客户端/服务器聊天示例。

我们的想法是在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

我的错误是什么?

1 个答案:

答案 0 :(得分:3)

  

我的错误是什么?

如果您希望从您选择的端口发送UDP数据包,则需要在发送UDP套接字上调用bind()以指定您希望套接字发送的(非零)端口从(和听)。如果不这样做,操作系统将选择一个可用的端口发送,如您所见。

请注意,这不一定是坏事:通常最好让操作系统为您选择一个端口,因为这样可以避免在您指定的端口不可用时可能发生的故障,因为某些其他程序是已经在使用它了。接收(服务器)程序可以使用recvfrom()读取UDP数据包,以找出它们来自的IP地址和端口号,因此即使您的UDP数据包不是,它也没有理由不能回复您的UDP数据包来自一个“知名”港口。