質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.90%

ソケット通信 C++

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 7,708

score 34

ソケット通信を用いて1対1の対戦プログラムを作ろうとしています。(それぞれが一手ずつ出して戦うじゃんけんのようなもの)

現在、2クライアント1サーバーでソケット通信を行っていて、ポート番号をサーバーとクライアントで合わせています。

サーバー内でポートを2つ設定(7000と7001)し、ソケットを生成
2つのクライアントでそれぞれポート番号を指定
クライアント1(ポート番号 7000)
クライアント2(ポート番号 7001)

ただ、この方法だとサーバーとクライアント側であらかじめポート番号を設定していないと通信できません。
さらに、今後は3以上のクライアントの要求を受け付け、2つのクライアントを結び付け、1対1の対戦を複数並行して行いたいと考えています。

そこで質問が2つあるのですが、
・1つ目
1つのポートで2つのクライアントを受け付けることはできるのでしょうか。また、その場合、どちらのクライアントからソケットが送られてきたかの識別はできるのでしょうか。

・2つ目
クライアントでポート番号を指定せず、サーバー側で適当に指定したポートに接続できるようにプログラムできるのでしょうか。

最近ソケット通信を勉強し始めたばかりで知識が浅く、見当違いな質問になっているかもしれませんが、よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

0

こんにちは。

UDPを使えば1も可能ですが、一般的な手法は2です。
例えば、WEBサーバのポートは80番ですが、当然複数のクライアントと通信できています。

下記手順がよく使われるそうです。

①サーバで特定のポートをリスンしておく。
②クライアントはその決まったボートへ接続要求を出す。
③サーバはそれを受けて、サブスレッドを生成し、クライアントの情報を渡す。
④サブスレッドは空いているポートAをオープンし、クライアントへ送信元ポート番号としてAを設定した応答パケットを送って、ポートAをリスンする。
⑤クライアントはサーバのポートAと通信する。

確かどこかのサイトに解説があったのですが、見つけることができませんでした。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

えーと、おそらくTCPで通信していると思うので、その前提で書きます。

TCPで通信をする場合、以下の様にポート番号のペアで通信しています。

サーバ:7000 <-----> クライアント1:自動採番されたポート番号
サーバ:7001 <-----> クライアント2:自動採番されたポート番号

ただし、この方法ですと書かれている通り、クライアント毎に別のポート番号を
指定する必要がありますし、サーバ側もきりが無いですよね。

そこで、一般的にはサーバ側で一つのポート番号で、複数の
クライアントと通信させるのが一般的です。

サーバ:7000 <-----> クライアント1:自動採番されたポート番号
サーバ:7000 <-----> クライアント2:自動採番されたポート番号

サーバ側で、どこから接続してきたかを知る方法は、用意されています。
バークレーソケットをつかっているのであれば、

newfd = accept(svfd, &addr, &addrln);

の様に呼びだした場合、第2引数に接続元のIPアドレスとポート番号が
セットされ、戻ってきます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

1つのポートで2つのクライアントを受け付けることはできるのでしょうか。

いくつでも好きなだけ(上限は決められていると思いますが)受け付けできます。

どちらのクライアントからソケットが送られてきたかの識別はできるのでしょうか。 

accept時に接続相手のIPアドレスも渡されるので、それで識別できると思います。
また、接続毎に新しいSOCKET(ファイルハンドルのようなもの)が作成されるので、いったん接続が確立すれば、そのSOCKETを介して1対1の通信になります。

クライアントでポート番号を指定せず、サーバー側で適当に指定したポートに接続できるようにプログラムできるのでしょうか。 

ぱっと思いつくアイディアとしては、HTTPでサーバー情報をGetするのがお手軽だと思います。特定URLでリクエストを送ったらレスポンスでポート番号が返ってくるイメージです。
ただ、ソケットを勉強したばかりだとHTTPサーバー/クライアントの構築はハードルが高いかもしれません(ライブラリを使えば簡単ですが)。あるいは、すでにWebサーバーなどが動いている環境だとうまくいかないかもしれません。
最初はポート番号固定でいいのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

winsockプログラミング - Geekなぺーじ
ここのサイトの内容は、度々お世話になりました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る