- ベストアンサー
Winsockでの送信(TCP)
Winsockでの送受信プログラムを作成しています。 システム構成としてはサーバーが1つあって、それに複数のPC(クライアント)を接続します。 そしてチャットのようにやりとりを行うプログラムを作成しています。 しかし、チャットと違う点は、文字を、指定した相手(IPで指定)にのみ送信するということです。 自分で調べた結果UDPを用いれば簡単だということを知りました。(sendtoで送信先IPが指定できるから) しかし、TCPのほうが信頼性が高いということでTCPでやりたいと思いました。(勉強にもなるので) どなたかやり方をご教授お願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
UDPでsendtoに送信先IPを指定すると、当然「直接」そこに対してパケットを投げます。 そのパケットはサーバを経由しませんが、それでサーバの役割として意図通りですか? メッセージはあくまでサーバに送って、サーバの方で特定の相手(IP)にのみ転送して欲しいのであれば、#2の方が書かれているように、vj8xdq さん自身のアプリケーションで、IPの管理をやらなければなりません。 この場合、UDPでも簡単になることはありません。 sendtoのあて先は、あくまでサーバにしなければならず、TCPのconnectのあて先をサーバにするのと変わらないからです。(その先の配信先は別途、何らかの手段で設定しなければならない。 なお、TCPで信頼性が高いというのは、パケットが相手に届かなかった場合に、自動的に再送信してくれるからです。 逆にいうと、UDPの場合、もしかすると相手にパケットが届かない可能性があるということです。 郵便にたとえると、TCP/IPの通信は郵便事故がおきる可能性があります(もちろん発生頻度は日本の郵便制度とは違います)。 TCPは書留みたいなもので、もし事故が起きても自動で再送信などの手続きをやってくれます。 UDPの通信は葉書のようなものでそういうことはしてくれません。 届かなくて困る可能性のあるものは、自分で「ちゃんと届いてるか」を相手に確認したり、送りなおしたりしないといけません。 その代わり、UDPの方が手続きがシンプルで早いです。(ポストに突っ込むだけ)
その他の回答 (2)
- rinkun
- ベストアンサー率44% (706/1571)
この構成の場合、基本的にTCPコネクションはサーバと各クライアントとの間でだけ張ります。そしてクライアント間の通信は全てサーバで中継することにします。 TCPコネクションを張るとサーバとクライアントの間には双方向のバイトストリームが構築されます。しかし単なるバイトストリームでは扱いづらいので、この上にアプリケーション独自のプロトコルを定義してクライアントからサーバ、サーバからクライアントに各種のコマンド等を流せるようにします。 例えば、クライアントからサーバに「現在サーバに繋がっているクライアントの(IPアドレス)リストを要求する」。それに対して、サーバからクライアントに「現在サーバに繋がっているクライアントの(IPアドレス)リストを通知する」などです。 クライアントから他のクライアントに文字列を送るときには、クライアントからサーバに「指定したクライアントに指定した文字列を送る」コマンドを送ることになります。 こうした各コマンドにどのようなデータ構造を与えるかはアプリケーション独自です。
お礼
早速の返事ありがとうございます!! ちょっと無知なためよくわかりません(; ;) もう少し詳細に説明してくださったらありがたいです。。。
- Werner
- ベストアンサー率53% (395/735)
コネクション指向の通信ならどちらかというとTCPの方が楽な気が…。 TCPでの送信先の制御は sendの第1引数に指定するソケットディスクリプタを 送信したいクライアントに対応したものにすればよいでしょう。
お礼
早速の回答ありがとうございます!! つまりソケットを各クライアント分作成して… この方法なら、なんとか出来そうな気がします!!
お礼
早速の回答ありがとうございます!! MrBanさんのおっしゃるとおりですね!! TCPでがんばって作成してみせます(^ ^)/