こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

TCP/IP通信に関する質問です。

下記の3つのLinuxPCを使って、TCP/IPによるソケット通信のシステムを作成しました。
PC1: IP:192.168.0.1 Port: 20000 TCPサーバ
PC2: IP:192.168.0.2 Port: 20000 TCPサーバ
PC3: IP:192.168.0.3 Port:ランダム(クライアントなので) TCPクライアント

PC3をクライアントとして、同じポート番号を持つアプリが動いている
PC1とPC2に繋いで通信をする形です。
このシステムは問題なく動きました。

しかし、続いてPC1とPC2を一つのPCに(ハードウェアとして)まとめたくなったときに、
下記の条件があったとき、どのようにすれば良いでしょうか?
1. PC3のソフトウェアは一行も変更しない
2.りPC1とPC2が同一のハードウェアになっても、それぞれのソケットに流れるデータは変わらない

一台のコンピュータにおいて、一つのNICに複数のIPをふることはできましたが、
同じポート番号のソケットを作成するのはできないと思っています。
今のところ、一台のコンピュータで仮想マシンを二台立ち上げる方法を考えていますが、
それ以外に上手い方法はあるでしょうか?

非常に困っているため、ご回答よろしくお願いします。

投稿日時 - 2014-11-22 16:27:23

QNo.8833569

困ってます

質問者が選んだベストアンサー

> 一台のコンピュータにおいて、一つのNICに複数のIPをふることはできましたが、
> 同じポート番号のソケットを作成するのはできないと思っています。

できますよ。
着信IPアドレスにINADDR_ANY、着信ポート番号に20000を指定してbind()を発行し
accept()で着信を待てば、複数のIPのどれで着信してもポート番号20000への
着信は全て受けられますよ。

着信IPアドレスに、複数のIPのどれか1つを設定したら、そのIPで着信した場合
のみ着信を受け付けます。
普通はINADDR_ANYを指定し、どんなIPが割り当てられていても受け付けるようbindします。

なので、1つのNICに複数のIPをふるのが最も簡単だと思います。
ただ、着信ポート20000を受け付けるサーバーアプリがINADDR_ANYでbindしてないとか
同時接続数に制限があるといったことがもしあるなら、サーバーアプリの改造が必要に
なる場合もあると思います。

投稿日時 - 2014-11-22 22:30:27

補足

ご回答ありがとうございます。
なるほどサーバソケットのaddr.sin_addr.s_addrの値は、クライアントのIPアドレスではなく、サーバのアドレスなのですね。
勘違いしていました。
上記の方法を試してみたいと思います。
結果が確認できたらもう一度報告させて頂きます。
貴重な情報ありがとうございましたm(_ _)m

投稿日時 - 2014-11-22 23:29:04

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(1)

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-