第一次发帖,希望这是一个简单的问题:
我需要向一台硬件发送广播包,但当它启动时,它位于不同于我的机器的子网上,为了告诉它将其IP地址重置为我的网络上的IP地址。但是,除非我使用DHCP,否则我似乎无法在自己的子网外进行广播,而最终我将无法使用DHCP。网络上没有路由器,只有我的机器和我要通信的盒子之间的简单交换机,以及其他几台Linux机器。
因此,基本上这个示例代码在Fedora 19的测试环境中可以工作(在我启用DHCP的较大网络上),直到我尝试静态设置我的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上默认设置。如果我改变网络上其他所有设备的网络参数,它就能正常工作,但这不是一个真正的选择。
编辑: 关于一些评论和答案,请注意我并没有使用路由器,只需在我的计算机和其他盒子之间连接一根电线即可复制行为。所以,问题实际上是,为什么Linux没有发送数据包?我显然不知道,但我怀疑Linux本身会丢弃跨子网广播数据包,除非它可以将该决策委托给网络上的另一个机构。无论如何,考虑到我的网络很小,我只能绕过它。
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)
中调整设置以取消广播? - Tony The Lion