我需要接收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中看到实际的数据包),但你永远不知道可能会出现什么问题。
bind
绑定到了错误的接口?在客户端机器上执行netstat -an | grep 6000
会返回什么? - Sean Brightbind()
方法实际上并没有打开端口,只有connect()
和listen()
方法才能做到。但是你不需要通过listen()
方法打开端口来接收 UDP 广播。 - Remy Lebeauconnect()
仅在套接字句柄内部建立本地和远程 IP/Port 对之间的静态关联,仅此而已。当我提到connect()
打开一个端口时,我是指 TCP。在 UDP 套接字上调用bind()
将绑定的 IP/Port 添加到 netstat 列表中,但不显示任何状态,这可能适用于所有 UDP 连接。 - Remy Lebeau