- ベストアンサー
WinSockを用いたUDP送受信ソケットプログラミングについて
こんにちは。 現在、VC++.NETでWinSockを用いたUDPソケットプログラミングを行っています。以下のようなプログラムを作りたいと思っているのですがうまく動作しません。 [概要] A:送信端末 B:受信端末 1.Aから文字列"send"をB端末へ送信。 2."send"を受信した受信端末Bは、A端末へ文字列"ok"を送信。 この1と2の動作を行わせたいと思っています。この場合、A,B端末は送信と受信を行う必要があります。 [問題点(うまくいかない点)] A→Bへ"send"は送信でき、B端末で受信できるのですが、B端末からA端末へ送信できません。B端末で送信できているのか、それともA端末で受信できていないのか?が分からない状態です。 [気づいた点] ポート番号を分ける必要があるのでしょうか?例えば、A→Bへは9000番。B→Aへは9001番という意味です。 送信と受信を行うため、送信・受信で2つのUDPソケットを使用する必要があるのでしょうか?例えば、 s1 = socket(AF_INET, SOCK_DGRAM, 0);←送信に利用 s2 = socket(AF_INET, SOCK_DGRAM, 0);←受信に利用 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>B端末で送信できているのか、それともA端末で受信できていないのか? 可能であればEtherRealというパケットキャプチャのインストールをおすすめします。デバッグが楽です。 >ポート番号を分ける必要があるのでしょうか? たぶん大丈夫だと思います。 A->B の場合、Aがsendtoで指定するのは送信元ポートではなく、送信先ポートです。 それがBのソケットの受信ポートと一致してさえいればよいです。 EtherRealでモニタしていると、送信元ポートはどうやら適当に決まっているようです。 >送信と受信を行うため、送信・受信で2つのUDPソケットを使用する必要があるのでしょうか? 非ブロッキングモードでの送受信(WSAASyncSelect等を使う)の場合は、FD_READ | FD_WRITE とすれば取りこぼしなく送受信できそうな気がします。 ブロッキングモードのときはだめかもしれないです。
その他の回答 (1)
- rinkun
- ベストアンサー率44% (706/1571)
>ポート番号を分ける必要があるのでしょうか? A,Bを同じPC上で動かす場合は分けておかないと区別が付かなくなるでしょうね。 異なるPC上で動かすなら分ける必要はないと思います。