10

初めてのポスターですが、うまくいけばこれは簡単なものです:

ブロードキャスト パケットをハードウェアの一部に送信する必要があります。ハードウェアの電源を入れたときに、自分のマシンとは異なるサブネット上にあり、IP アドレスを自分のネットワーク上のアドレスにリセットするように指示する必要があります。しかし、DHCP を使用していない限り、自分のサブネットからブロードキャストすることはできないようです。最終的にはできません。ネットワーク上にルーターはなく、マシンと通信しようとしているボックスとの間の単純なスイッチと、ネットワーク上の他の Linux マシンがいくつかあります。

したがって、基本的に、このコード例は、IP アドレスを静的に設定しようとするまで、テスト環境 (DHCP が有効になっている大規模なネットワーク) の Fedora 19 で機能します。

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自体がクロスサブネットブロードキャストパケットをドロップするのではないかと思います. いずれにせよ、私のネットワークは非常に小さいため、回避する必要があります。

4

3 に答える 3

5

この問題に遭遇しました。ゲートウェイを削除するまではすべて正常に機能し、ソケットから送信しようとするとネットワークに到達できないというエラーが発生しました。

ブロードキャスト メッセージを使用してボックスのネットワーク設定を構成しているため、ゲートウェイ アドレスを構成して動作させることはできません。ただし、私のボックスにはネットワーク インターフェイスが 1 つしかないため、次の解決策を見つけました。

// 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 アドレスに送信できます。このソリューションは、使用するインターフェイスがわかっている限り、複数のネットワーク インターフェイスで動作するはずです。

于 2016-10-26T11:57:12.127 に答える
3

定義上、ブロードキャストは 1 つのサブネットに限定されます。ブロードキャストが自分のサブネットを抜け出し、インターネットをオーバーフローするのを見るのは恐ろしいことです。サブネットをまたがる方法を探している場合は、 を参照してくださいMulticastこちらもご確認ください。幸運を!

于 2013-11-04T16:01:23.250 に答える