web-dev-qa-db-ja.com

UDPブロードキャストの受信

UDPブロードキャストを受信する必要があります(それが違いを生む場合はUbuntuで)。 Wiresharkを使用すると、サーバーマシンから送信されているパケットと、クライアントマシンによって受信されているパケットを確認できますが、プログラムは完全に認識されていません。これは私が持っているものです:

sockaddr_in si_me, si_other;
int s;
assert((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))!=-1);
int port=6000;
int broadcast=1;

setsockopt(s, SOL_SOCKET, SO_BROADCAST,
            &broadcast, sizeof broadcast);

memset(&si_me, 0, sizeof(si_me));
si_me.sin_family = AF_INET;
si_me.sin_port = htons(port);
si_me.sin_addr.s_addr = INADDR_ANY;

assert(::bind(s, (sockaddr *)&si_me, sizeof(sockaddr))!=-1);

while(1)
{
    char buf[10000];
    unsigned slen=sizeof(sockaddr);
    recvfrom(s, buf, sizeof(buf)-1, 0, (sockaddr *)&si_other, &slen);

    printf("recv: %s\n", buf);
}

デバッグモードでコンパイルされ、コンパイル中にアサートが消去されることはなく、プログラムはrecvfromでブロックするだけです。

ターゲットを絞らないUDPブロードキャストを受信するためにジャンプする必要がある他のフープはありますか?

編集:もう少し情報があります。2台のコンピューターを専用のスイッチに接続しています。外部からの干渉はありません。また、クライアントコンピューターに、会社のネットワークに接続する2番目のネットワークカードがあります。これも機能します。

外部(インターネットワーキング)とサーバーマシンの両方にpingを実行できます(さらに、Wiresharkで実際のパケットを確認できます)が、この問題の原因がわからない場合があります。

10
Blindy

結局のところ、私のコードは、私が思っていたように、完全に問題ありません。ネットワーク設定自体に問題がありました。

後世のために、サーバーマシンに組み込まれているDHCPサーバーを使用して他のコンピューターにIPアドレスを割り当てる代わりに、独自のハブに2台の静的IPコンピューターをセットアップしました。私の問題のためにかなりローカライズされていますが、あなたは決して知りません。

2
Blindy

放送を送受信するには

  1. ネットマスクが正しいことを確認してください。 Windowsではブロードキャストパケットのマスクは重要ではありませんが、Linuxでは重要ではありません。

  2. ソケットをINADDR_ANYにバインドします

  3. 放送へのsetsockopt

  4. sendaddr.sin_addr.s_addr = inet_addr( "your_interface_broadcast_address")を指定してsendtoを呼び出します。または-ブロードキャストIPアドレスを使用して、インターフェイスごとに銭湯を数回呼び出します。

  5. recvfromを呼び出します。 recvfromを呼び出す前に、いつでも長さパラメーターを設定してください。

1
Fl0