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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

10742閲覧

ソケット通信 C++

syana2000

総合スコア34

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/08/03 12:21

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

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

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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

投稿2016/08/04 05:23

mao999

総合スコア111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

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

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

投稿2016/08/03 15:39

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

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

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

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

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

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

投稿2016/08/03 15:02

ShinyaAnan

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんにちは。

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

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

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

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

投稿2016/08/03 12:49

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問