Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将UDP数据包广播到255.255.255.255_Linux_Networking_Network Programming_Udp_Dhcp - Fatal编程技术网

Linux 将UDP数据包广播到255.255.255.255

Linux 将UDP数据包广播到255.255.255.255,linux,networking,network-programming,udp,dhcp,Linux,Networking,Network Programming,Udp,Dhcp,第一张海报,希望这是一张简单的海报: 我需要向一个硬件发送一个广播数据包,当它通电时,它位于与我的机器不同的子网上,以便告诉它将其IP地址重置为我网络上的IP地址。但是,除非我使用DHCP,否则我似乎无法在自己的子网外广播,而这最终是我无法做到的。网络上没有路由器,只有一个简单的交换机,在我的机器和我想与之通话的机器之间,加上网络上的其他几台Linux机器 因此,基本上,这个示例代码在测试环境(在我启用了DHCP的更大网络上)的Fedora19上工作,直到我尝试静态设置我的IP地址: int m

第一张海报,希望这是一张简单的海报:

我需要向一个硬件发送一个广播数据包,当它通电时,它位于与我的机器不同的子网上,以便告诉它将其IP地址重置为我网络上的IP地址。但是,除非我使用DHCP,否则我似乎无法在自己的子网外广播,而这最终是我无法做到的。网络上没有路由器,只有一个简单的交换机,在我的机器和我想与之通话的机器之间,加上网络上的其他几台Linux机器

因此,基本上,这个示例代码在测试环境(在我启用了DHCP的更大网络上)的Fedora19上工作,直到我尝试静态设置我的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中显示的发送数据包的数量没有增加。我尝试禁用防火墙:

sudo iptables -F
但那没用。有人看到我遗漏的东西吗?我可以广播到192.168.100.255,但这不会到达我需要通话的方框,例如,默认情况下可能是192.168.200.10、255.255.255.0。我可以通过更改网络上其他所有设备的网络参数来实现,但这不是一个真正的选项

编辑:
关于一些评论和答案,请注意,我没有使用路由器,只需在我的计算机和另一个盒子之间连接一根电线,就可以复制这种行为。所以,真正的问题是,为什么Linux不发送数据包?我不清楚,但我怀疑Linux本身会丢弃跨子网广播数据包,除非它可以将该决定委托给网络上的另一个权威机构。在任何情况下,考虑到我的网络太小,我只能绕过它。

根据定义,广播仅限于一个子网。看到广播从一个人的子网中逃出并在互联网上泛滥将是可怕的。如果您正在寻找一种跨子网的方法,那么您应该看看
多播
。也检查一下。祝你好运

请检查您的默认网关。如果网关的IP位于另一个子网中,则会出现错误“网络不可访问”。在广播到255.255.255.255地址一段时间后,通过直接发送到子网广播的方式(例如,如果您的IP为192.168.1.1,则为192.168.1.255),即使网关IP位于另一个子网中,也会正常工作。

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

由于我正在使用广播消息来配置我的邮箱的网络设置,因此我也不能配置网关地址以使其正常工作。但是,由于我的机箱只有一个网络接口,我找到了以下解决方案:

//绑定到正确的接口,以便在没有默认网关的情况下发送
字符[]=“eth0”;
setsockopt(fd,SOL_SOCKET,SO_BINDTODEVICE,netif,sizeof(netif))


有了这个,我就能够发送到套接字上的广播255.255.255.255地址,而不管任何默认网关。只要你知道你想使用什么接口,这个解决方案就可以与多个网络接口一起使用。

你是否在
setsockopt(sock,solu-SOCKET,SO\u BROADCAST,&BROADCAST,sizeof(BROADCAST)
中调整你的设置,使之不是广播?如果发送到()功能失效,这将提供更多的h'DHCP'是一种非常特殊的广播情况,因为路由器充当中继代理,并将DHCP“消息”再次广播到其他子网。如下所述:同一子网上的DHCP客户端和服务器最初通过UDP广播进行通信。如果客户端和服务器位于不同的子网上,则可以使用DHCP助手或DHCP中继代理。请求续订现有租约的客户端可以直接通过UDP单播进行通信,因为客户端在该点上已经有一个已建立的IP地址。“谢谢,我应该在原始帖子中检查errno。perror(“sendto”)打印出“网络无法访问”这对我来说毫无意义——我知道路由器的责任是丢弃数据包,但由于没有路由器,我会想象交换机上的任何东西都能够接收数据包。@GPHoit是不是有可能连接到路由器?OP只发送到255.255.255.255。但是sendto()失败。这应该正常工作。还要记住,如果你们都在同一个第2层广播域上,那么你们可以广播到不同的IP子网(你们永远不应该是,但OP描述他实际上是).hmm.我有点困惑。他提到使用广播到达不同子网上的一块硬件。但是,他继续发布了一个代码,这显然不符合更改IP地址时的要求。无论如何,除非他有一个特殊的路由器(cisco…),否则预期的广播不会通过路由器,他可以对此进行配置。@否:我认为如果子网掩码为255.255.0.0(B类),则会出现这种情况.但他在C类网络上。因此,广播到192.168.100.255将达到192.168.100.X,但不会达到192.168.200.10。是的,但他使用的是广播地址255.255.255.255,这在linux中应该是可以做到的,而且他没有路由器。这意味着,例如,你使用一个哑以太网交换机,你将一台PC连接到它,比如说192。168.100.0/24和192.168.200.0/24上的一台电脑。这两台电脑现在在同一个以太网广播域上,应该能够看到每个小时到255.255.255.255的广播数据包。(他们甚至能够看到(至少使用wireshark)每个人到192.168.100.255或192.168.200.255的广播,尽管他们不会看到