2011-07-27 13 views
0

私は2台のコンピュータで2ウェイブロードキャストシステムを実行しようとしています。私の初めてのネットワークプログラミングとC + +で。私はコンピュータAとコンピュータBをそれぞれ2つのソケットが各コンピュータとクライアント上のソケットsdとsd1、各コンピュータのサーバ宣言を宣言していると言うことができます。2ウェイUDPブロードキャスト問題、ボウルランドターボC++

コンピュータB上の
recvfrom(sd, (char *)received_buffer, 100, 0, NULL, 0) 

、ソケットSDが設定されている:コンピュータA上で、コンピュータA上のソケットSDはその後、それが使用して放送コンピュータBからの情報を受信するコンピュータAで192.168.2.100:50000のクライアントIPにバインドされ

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

ブロードキャスト使用のためにブロードキャストされません。コンピュータBは、使用してコンピュータに情報をブロードキャスト:

コンピュータB上の宣言サーバは(それがそのIPに放送するように、コンピュータA上のクライアントのIPと同じ)IP 192.168.2.100:50000である
sendto(sd, (char *)send_buffer, 100, 0, (struct sockaddr *)&server, (int)sizeof(struct sockaddr_in)) 

コンピュータBがコンピュータAにブロードキャストするとき、上記の方法はうまくいきます。しかし、逆に同じことをしようとすると、コンピュータAはコンピュータBにブロードキャストしますが、動作しません。コンピュータA上で、ソケットSD1が宣言され、使用して放送用セット:

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

をし、SD1がバインドされていないと、コンピュータBにコンピュータAの放送が使用して:サーバーがIP 192.168として宣言されて

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

。 2.2:40000(コンピュータBのクライアントIPアドレスでブロードキャストします)。コンピュータBでは、ソケットsd1が宣言され、IP 192.168.2.2:40000で自動的に取得されたクライアントとIPにバインドされます。非常に長い物語のために

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

マイapolgies、しかし、私はできるだけ明確にする必要があります:コンピューターBには、使用して放送を受信します。誰もコンピュータBがコンピュータAからのブロードキャストを受信できない理由について誰にも気付くことができますか?

+0

戻り値を確認しましたか? setsockopt(... BROADCAST)が失敗することがあります。私はできるだけ放送を避けようとします。 – harper

答えて

0

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

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

これ以上近づけない場合は、両方のコンピュータで全く同じプログラムを実行してください。つまり、sdsd1の役割を入れ替えないでください。むしろ、両方のコンピュータで同じプログラム(および可能であれば同じバイナリ)を実行し、スニッファーでデータグラムが正しく受信されたことを確認します。次に、プログラムが相互に受信できるかどうかを確認できます。この場合、プログラムBコードに誤作動の原因となる見通しがある可能性があります。

最後に、は有効な双方向パスを確認しないため、基本的な双方向通信を確認します(ファイアウォールは受信エコー要求をブロックすることはよくありますが、応答はしません)。次に、通常の(非ブロードキャスト)UDPソケットを使用してUDP通信を検証します。ユニキャストは許可されているかもしれませんが、ブロードキャストは許可されていない可能性があります。

関連する問題