初めてのポスターですが、うまくいけばこれは簡単なものです:
ブロードキャスト パケットをハードウェアの一部に送信する必要があります。ハードウェアの電源を入れたときに、自分のマシンとは異なるサブネット上にあり、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自体がクロスサブネットブロードキャストパケットをドロップするのではないかと思います. いずれにせよ、私のネットワークは非常に小さいため、回避する必要があります。