0

2 台のコンピューターで双方向ブロードキャスト システムを実行しようとしています。初めてネットワーク プログラミングを行い、C++ を使用します。コンピューターAとコンピューターBがあり、それぞれに2つのソケットが宣言され、各コンピューターとクライアントにソケットsdとsd1、各コンピューターにサーバー宣言があるとしましょう。コンピューター A では、コンピューター A のソケット sd がコンピューター A の 192.168.2.100:50000 のクライアント IP にバインドされています。次に、ブロードキャスト コンピューター B から情報を受信します。

recvfrom(sd, (char *)received_buffer, 100, 0, NULL, 0)

コンピューター B では、ソケット sd が次を使用してブロードキャスト用に設定されます。

setsockopt(sd, SOL_SOCKET, SO_BROADCAST, (char *)&broadcastpermission, sizeof(struct sockaddr_in))

ただし、ブロードキャストの使用のため、sd はバインドされていません。コンピューター B は、次を使用してコンピューター A に情報をブロードキャストします。

sendto(sd, (char *)send_buffer, 100, 0, (struct sockaddr *)&server, (int)sizeof(struct sockaddr_in))

ここで、コンピューター B で宣言されたサーバーの IP は 192.168.2.100:50000 です (コンピューター A のクライアントの IP と同じであるため、その IP にブロードキャストされます)。

この上記の方法は、コンピューター B がコンピューター A にブロードキャストするときに正常に機能します。ただし、逆に同じことをしようとすると、コンピューター A がコンピューター B にブロードキャストすると、機能しません。コンピューター A では、ソケット sd1 が宣言され、次を使用してブロードキャスト用に設定されます。

setsockopt(sd1, SOL_SOCKET, SO_BROADCAST, (char *)&broadcastpermission, sizeof(struct sockaddr_in))

sd1 はバインドされておらず、コンピューター A は次を使用してコンピューター B にブロードキャストします。

sendto(sd1, (char *)send_buffer, 100, 0, (struct sockaddr *)&server, (int)sizeof(struct sockaddr_in))

ここで、サーバーは IP 192.168.2.2:40000 として宣言されます (コンピューター B のクライアント IP アドレスであり、そこでブロードキャストされます)。コンピューター B では、socket sd1 が宣言され、クライアントにバインドされ、IP 192.168.2.2:40000 で IP が自動的に取得されます。コンピューター B は、次を使用してブロードキャストを受信します。

recvfrom(sd, (char *)received_buffer, 100, 0, NULL, 0)

非常に長い話で申し訳ありませんが、できるだけ明確にする必要があります。コンピューター B がコンピューター A からのブロードキャストを受信できない理由を誰か教えてもらえますか?

4

1 に答える 1

0

あなたが説明しているのは、コミュニケーションの 1 つの方法は機能するが、もう 1 つの方法は機能しないということのようです。これはほとんどの場合、コードの問題ではなく、ネットワークの構成 (ほとんどの場合、ファイアウォール) に関連しています。

スニファー ( Wiresharkなど) を使用して、コンピューター B がコンピューター A からブロードキャスト UDP データグラムを受信して​​いることを確認します。そうでない場合は、コンピューター A が正しい UDP データグラムを送信していることを確認します。A が送信しているのに B が受信していない場合は、ネットワークの問題 (ルーター、ファイアウォールなど) があります。B は受信しているが、アプリケーションは受信していない場合は、ポート番号が正しいことを確認してください。コンピューター B でnetstat (を使用-a -n) を使用して、正しいポートで UDP ソケットが開いているかどうかを確認できます。

これでうまくいかない場合は、両方のコンピューターでまったく同じプログラムを実行してみてください。つまり、sdとのsd1役割を交換しないでください。そうではなく、両方のコンピュータで同じプログラム (および可能であれば同じバイナリ) を実行し、データグラムが正しく受信されていることをスニファで確認します。次に、プログラムが相互に受信できるかどうかを確認できます。この場合、プログラム B のコードに見落としがあり、誤動作を引き起こしている可能性があります。

最後に、ping各コンピューターを他のコンピューターから ping することにより、基本的な双方向通信を確認するために使用します (ping有効な双方向パスを確認しないことに注意してください - ファイアウォールは多くの場合、着信エコー要求をブロックしますが、応答はブロックしません)。次に、通常の (非ブロードキャスト) UDP ソケットを使用して、UDP 通信を確認します。ユニキャストは許可されているかもしれませんが、ブロードキャストは許可されていません。

于 2011-07-27T06:39:47.040 に答える