UDP数据包未送达-recvfrom()永远不会返回
我已设置UDP接收器,如下所示:UDP数据包未送达-recvfrom()永远不会返回,c,sockets,udp,fedora,C,Sockets,Udp,Fedora,我已设置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);
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 SUCCESSFULL\n");
}
char buf[250];
while(1) {
printf("WAITING\n");
recvfrom(rx_socket, buf, sizeof(buf), 0, (struct sockaddr *)&rem_addr, &addrlen);
printf("RECEIVED\n");
}
recvfrom()永远不会返回。我做了一些Wireshark分析,它表明数据包存在:
总结:
用户数据报协议,Src端口:57506(57506),Dst端口: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 bytes\n", bytesSent);
sleep(1000);
}
所以问题出在virtualbox上。我的发送方在主机上,但接收方在虚拟机上。如果我也在主机上运行接收器,就会收到UDP数据包 程序的输出是什么?第一次打印到控制台:“WAITING”OT:This
如果(!rc)
是错误的bind()
在出错时返回-1
,因此如果(-1!=rc),则应为<代码>0
是一个很少使用但有效的套接字描述符。好的,wireshark显示端口正确-IP正确吗?您是否允许防火墙中的特定端口(fedora默认启用该端口)?或者尝试禁用防火墙,/sbin/service iptables stop
wireshark中的一切正常吗?(它可以显示IP报头校验和和和UDP校验和是否有效-打开这些设置。并检查MAC地址是否匹配)