我正在尝试使用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
我的错误是什么?
答案 0 :(得分:3)
我的错误是什么?
如果您希望从您选择的端口发送UDP数据包,则需要在发送UDP套接字上调用bind()以指定您希望套接字发送的(非零)端口从(和听)。如果不这样做,操作系统将选择一个可用的端口发送,如您所见。
请注意,这不一定是坏事:通常最好让操作系统为您选择一个端口,因为这样可以避免在您指定的端口不可用时可能发生的故障,因为某些其他程序是已经在使用它了。接收(服务器)程序可以使用recvfrom()读取UDP数据包,以找出它们来自的IP地址和端口号,因此即使您的UDP数据包不是,它也没有理由不能回复您的UDP数据包来自一个“知名”港口。