我已经设置了一个UDP接收器,如下所示:
int rx_socket;
struct sockaddr_in my_addr;
struct sockaddr_in rem_addr;
socklen_t addrlen = sizeof(rem_addr);
rx_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(9900);
rc = bind(rx_socket, (struct sockaddr *) &(my_addr), sizeof(my_addr));
if (!rc) {
printf("BIND SUCCESSFULLn");
}
char buf[250];
while(1) {
printf("WAITINGn");
recvfrom(rx_socket, buf, sizeof(buf), 0, (struct sockaddr *)&rem_addr, &addrlen);
printf("RECEIVEDn");
}
recvfrom() 永远不会返回。我已经做了一些Wireshark分析,它表明数据包在那里:
总结:
用户数据报协议,源端口:57506 (57506),端口:IUA (9900)
校验和:0x14a2 [验证已禁用]
数据(8 字节)
任何帮助将不胜感激。
编辑:
一个有趣的观察是,作为 DSP 的源无法发送数据包,即 sendto() 返回 -1,直到我从目的地 ping 到它。在ping之后,源可以立即开始传输数据包。
编辑2:
这是发件人的代码:
int fd;
fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(9900);
inet_aton("10.0.201.102", &(my_addr.sin_addr));
char buf[250];
for (;;) {
int bytesSent = sendto(fd, buf, 8, 0,
(struct sockaddr *) &(my_addr), sizeof(my_addr));
printf("sent: %d bytesn", bytesSent);
sleep(1000);
}
所以问题出在虚拟盒子上。我的发送方位于主机上,但接收方位于虚拟机上。如果我也在主机上运行接收器,则会收到 UDP 数据包。