【发布时间】:2014-02-13 18:39:17
【问题描述】:
我已经设置了一个 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 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);
}
【问题讨论】:
-
程序的输出是什么?
-
第一次打印到控制台:“WAITING”
-
OT:这个
if (!rc)错了!bind()出错时返回-1,所以它应该是if (-1 != rc)。0是一个很少使用但有效的套接字描述符。 -
好的,wireshark 显示端口正确 - IP 正确吗?
-
您是否允许防火墙中的特定端口(fedora 默认启用)?或者尝试禁用防火墙,
/sbin/service iptables stopwireshark 中一切正常吗? (它可以显示 IP 标头校验和和 UDP 校验和是否有效 - 打开这些设置。并检查 MAC 地址是否匹配)