广播UDP数据包到255.255.255.255

第一次海报,希望这是一个容易的:

我需要将广播数据包发送到一个硬件,当它通电时,它与我的机器位于不同的子网上,以便告诉它把IP地址重置为我networking上的IP地址。 但是,除非我使用DHCP,否则我似乎无法通过自己的子网进行广播,而最终我无法做到这一点。 networking上没有路由器,只是简单地在我的机器和我正在试图交谈的盒子之间切换,另外还有一些networking上的其他Linux机器。

所以基本上这个例子代码在testing环境(在我有DHCP启用的一个更大的networking上)在Fedora 19上工作,直到我尝试静态设置我的IP地址:

int main(int argc, char *argv[]) { int sock; if( (sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { perror("socket : "); return -1; } int broadcast = 1; if( setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)) != 0 ) { perror("setsockopt : "); close(sock); return -1; } char *ip = "255.255.255.255"; char * msg = "Hello World!"; struct sockaddr_in si; si.sin_family = AF_INET; si.sin_port = htons( 4444 ); inet_aton( ip, &si.sin_addr.s_addr ); /* send data */ size_t nBytes = sendto(sock, msg, strlen(msg), 0, (struct sockaddr*) &si, sizeof(si)); printf("Sent msg: %s, %d bytes with socket %d to %s\n", msg, nBytes, sock, ip); return 0; } 

如果我使用DHCP,输出是:

 Sent msg: Hello World!, 12 bytes with socket 3 to 255.255.255.255 

我可以看到数据包在Wireshark中出去。

然后,如果我静态设置我的IP,192.168.100.1,我得到:

 Sent msg: Hello World!, -1 bytes with socket 3 to 255.255.255.255 

而我在Wireshark中看不到这个数据包。 我可以确认在ifconfig中显示的TX数据包数量不增加。 我试过禁用防火墙:

 sudo iptables -F 

但那没有做任何事情。 有人看到我失踪的东西? 我可以广播到192.168.100.255,但这不会让我需要谈谈,例如可能在192.168.200.10,255.255.255.0默认情况下。 我可以通过改变networking上所有其他的networking参数来使其工作,但这不是一个真正的select。

编辑:至于一些意见和答案,请注意,我没有使用路由器,可以复制行为与我的电脑和另一个盒子之间的任何东西,但只是一个电线。 所以,真正的问题是,Linux为什么不发送数据包? 我不知道,但我怀疑Linux本身会丢弃跨子网广播数据包,除非它可以将该决定委托给networking上的另一个权威机构。 无论如何,鉴于我的networking非常小,我只需要解决它。

Solutions Collecting From Web of "广播UDP数据包到255.255.255.255"

我刚刚遇到这个问题。 一切工作正常,直到我删除网关,然后当我试图从套接字发送时,我得到一个网络不可达错误。

由于我正在使用广播消息来配置我的盒子的网络设置,因此我不能配置网关地址来使其工作。 然而,因为我的箱子只有一个网络接口,我发现了以下解决方案:

// Bind to the proper interface to be able to send without default gateway char netif[] = "eth0"; setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, netif, sizeof(netif));

有了这个,我能够发送到广播255.255.255.255地址的插座,无论任何默认网关。 只要你知道你要使用的接口,这个解决方案应该可以和多个网络接口一起工作。

按定义广播仅限于一个子网。 看到广播逃离自己的子网并溢出互联网将是可怕的。 如果您正在寻找跨越子网的方法,那么您应该查看Multicast 。 也检查这一点 。 祝你好运!

检查您的默认网关。 如果网关的IP位于另一个子网中,则会出现“Network is unreachable”错误。 经过一段时间广播到255.255.255.255地址后,直接发送到子网广播(192.168.1.255,如果你的ip是192.168.1.1),即使网关ip在另一个子网中也能正常工作。