将UDP数据包广播到255.255.255.255

时间:2013-11-04 15:47:45

标签: linux networking network-programming udp dhcp

第一次发表海报,希望这是一个简单的海报:

我需要向一块硬件发送广播数据包,当它启动时,与我的机器位于不同的子网上,以告诉它将其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本身会丢弃跨子网广播数据包,除非它可以将该决定委托给网络上的另一个机构。无论如何,鉴于我的网络太小,我只需要解决它。

3 个答案:

答案 0 :(得分:4)

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

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

// 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地址,而不管任何默认网关。只要您知道要使用的接口,此解决方案就可以使用多个网络接口。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

请检查您的默认网关。如果网关的IP位于另一个子网中,您将收到错误"网络无法访问。"经过一段时间广播到255.255.255.255地址后,即使网关IP在另一个子网中,直接发送到子网广播(如果你的IP为192.168.1.1,192.168.1.255)也能正常工作。