gpt4 book ai didi

linux - 向 255.255.255.255 广播 UDP 数据包

转载 作者:IT王子 更新时间:2023-10-29 00:26:39 24 4
gpt4 key购买 nike

第一次张贴,希望这是一个简单的:

我需要向一个硬件发送一个广播数据包,当它启动时,它位于与我的机器不同的子网上,以便告诉它重置其 IP 地址为我网络上的 IP 地址。但是,除非我使用 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 本身会丢弃跨子网广播数据包,除非它可以将该决定委托(delegate)给网络上的另一个机构。无论如何,考虑到我的网络太小,我只能解决它。

最佳答案

我刚遇到这个问题。一切正常,直到我删除了网关,然后在尝试从套接字发送时收到网络无法访问的错误。

因为我使用广播消息来配置我的盒子的网络设置,所以我不能通过配置网关地址来使其正常工作。然而,由于我的盒子只有一个网络接口(interface),我找到了以下解决方案:

//绑定(bind)到正确的接口(interface),以便能够在没有默认网关的情况下发送
char netif[] = "eth0";
setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, netif, sizeof(netif));

有了这个,我就可以发送到套接字上的广播 255.255.255.255 地址,而不管任何默认网关。只要您知道要使用的接口(interface),该解决方案就应该适用于多个网络接口(interface)。

关于linux - 向 255.255.255.255 广播 UDP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19771485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com