dポイントプレゼントキャンペーン実施中!

UDP/IPでのソケット作成について(winsock)
開発環境VC++.NET、O/S WIN2000にてソケットプログラミング(winsock2.0)をしています。
コンソールプログラミングではありませんが、WindProcは持っていません。

UDPサーバーを作り、複数クライアントの対応をしたいと考えています。
クライアントAからの通信やりとり中に
クライアントBからの通信がきたら、そちらとも通信やりとりを(自動で)行いたい。

ここで問題なのが、クライアントAの要求ポートが15000で、
クライアントBの要求ポートも15000なのです。

同じ既に開いているポートでソケット作成しようとしても、socket()関数はエラーを返してくるのですが、
やり方を工夫すれば、同一ポートでの複数クライアント対応は可能なのでしょうか。不可能なのでしょうか。
可能であれば、やり方、ヒント等教えてください。よろしくお願いします。

追記
(1)TCP/IPでは、同一ポートでソケット作成が可能でした。ネットで探したサンプルプログラムが
 そのような動きをしていたのですが、UDPに書換えることはできませんでした。
 http://eternalwindows.jp/network/winsock/winsock …

(2)UNIXの場合fork()処理後に socket()作成 → bind()で同一ポートでの複数クライアント対応が
 上手くいくらしいのですが、Windowsではマルチスレッド等をうまく活用すれば、
 fork()と同様の処理が可能になり、目的が達成できるでしょうか。

A 回答 (2件)

まあ、複数プロセスとやり取りしたいのだったら、リッスンポートにアクセスして認証できた時点で別プロセス立ち上げて別ポートで通信始めるというのが簡単な気がします。



クライアントも認証が終了したらサーバーから伝えられたポートに変更すれば何台通信されても(まあ、限界は有りますけど)大抵受け付けられます。

ただし、そのソケットが開かないっていうのを回避するのであれば、リッスンポート増やすんだったと思いますけど。記憶はあいまいです。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。

>リッスンポートにアクセスして認証できた時点で
今回はUDP/IPなので、listen()を使っていないのですが、「別プロセス立ち上げて別ポートで通信始める」というやり方に挑戦してみたいと思います。

>ソケットが開かないっていうのを回避するのであれば、リッスンポート増やす
今回はUDP/IPなので、listen()を使っていないので、リッスンポート増やす事はできないと思いますが、いかがでしょうか。

お礼日時:2010/08/04 10:19

それを昔vxworksでやったことがあります。


UDP同一ポート複数接続は、不可能ではありません。

受信時にselectで待って、それから、スレッド生成してセッションの情報を送って
やればできるように思います。

自分が過去やったのは、上記のような並行サーバではなく、反復サーバでした(マイコンですので)が、
それで実装できています。
いずれも 15000番のソケット1つで実装できるのではないでしょうか。

>同じ既に開いているポートでソケット作成しようとしても、socket()関数はエラーを返してくるのですが、
これはできません。おわかりですよね。
    • good
    • 0
この回答へのお礼

簡単なプログラムですが、いちおうUDP同一ポート複数接続が出来るようになりました。
アドバイスありがとうございました。

お礼日時:2011/01/25 10:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!