我必须接收 UDP 广播(在 Ubuntu 中,如果这有什么不同的话)。使用 Wireshark,我可以看到从服务器机器发送的数据包,并且我可以看到它正在被我的客户端机器接收,但我的程序完全没有注意到。这就是我所拥有的:
sockaddr_in si_me, si_other;
int s;
assert((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))!=-1);
int port=6000;
int broadcast=1;
setsockopt(s, SOL_SOCKET, SO_BROADCAST,
&broadcast, sizeof broadcast);
memset(&si_me, 0, sizeof(si_me));
si_me.sin_family = AF_INET;
si_me.sin_port = htons(port);
si_me.sin_addr.s_addr = INADDR_ANY;
assert(::bind(s, (sockaddr *)&si_me, sizeof(sockaddr))!=-1);
while(1)
{
char buf[10000];
unsigned slen=sizeof(sockaddr);
recvfrom(s, buf, sizeof(buf)-1, 0, (sockaddr *)&si_other, &slen);
printf("recv: %s\n", buf);
}
它是在调试模式下编译的,编译过程中不会删除断言,我的程序只是阻塞在recvfrom
.
我必须跳过其他任何箍来接收无目标的 UDP 广播吗?
编辑:更多信息,我将两台计算机连接在专用交换机上,没有外部干扰。我的客户端计算机上还有第二个网卡,它连接到公司网络,它也可以工作。
我可以 ping 外部(互联网工作)和我的服务器机器(而且我可以在 Wireshark 中看到实际的数据包),但你永远不知道是什么导致了这个问题。