質問: ソケット通信を用いて1対1の対戦プログラムを作ろうとしています。(それぞれが一手ずつ出して戦うじゃんけんのようなもの) 現在、2クライアント1サーバーでソケット通信を行っていて、ポート番号をサーバーとクライアントで合わせています。 サーバー内でポートを2つ設定(7000と7001)し、ソケットを生成 2つのクライアントでそれぞれポート番号を指定 クライアント1(ポート番号 7000) クライアント2(ポート番号 7001) ただ、この方法だとサーバーとクライアント側であらかじめポート番号を設定していないと通信できません。 さらに、今後は3以上のクライアントの要求を受け付け、2つのクライアントを結び付け、1対1の対戦を複数並行して行いたいと考えています。 そこで質問が2つあるのですが、 ・1つ目 1つのポートで2つのクライアントを受け付けることはできるのでしょうか。また、その場合、どちらのクライアントからソケットが送られてきたかの識別はできるのでしょうか。 ・2つ目 クライアントでポート番号を指定せず、サーバー側で適当に指定したポートに接続できるようにプログラムできるのでしょうか。 最近ソケット通信を勉強し始めたばかりで知識が浅く、見当違いな質問になっているかもしれませんが、よろしくお願いします。
回答: えーと、おそらくTCPで通信していると思うので、その前提で書きます。 TCPで通信をする場合、以下の様にポート番号のペアで通信しています。 サーバ:7000 <-----> クライアント1:自動採番されたポート番号 サーバ:7001 <-----> クライアント2:自動採番されたポート番号 ただし、この方法ですと書かれている通り、クライアント毎に別のポート番号を 指定する必要がありますし、サーバ側もきりが無いですよね。 そこで、一般的にはサーバ側で一つのポート番号で、複数の クライアントと通信させるのが一般的です。 サーバ:7000 <-----> クライアント1:自動採番されたポート番号 サーバ:7000 <-----> クライアント2:自動採番されたポート番号 サーバ側で、どこから接続してきたかを知る方法は、用意されています。 バークレーソケットをつかっているのであれば、 newfd = accept(svfd, &addr, &addrln); の様に呼びだした場合、第2引数に接続元のIPアドレスとポート番号が セットされ、戻ってきます。