匿名質問者
匿名質問者匿名質問者とは「匿名質問」を利用して質問した質問者。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら

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

非常に困っているため、是非力を貸してもらえると幸いです。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/11/22 15:51:07
  • 終了:2014/11/25 21:01:46

ベストアンサー

匿名回答1号 No.1

匿名回答1号「匿名質問」を利用した質問に回答すると「匿名回答○号」と匿名で表示されます。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら
2014/11/22 22:50:56

TCP/IPではアドレスとポートの両方で相手を特定します。
socketではlistenの前にbindしますが、そこでINADDR_ANYではなく、具体的なローカルアドレスである192.168.0.1や192.168.0.2を指定してください。
これにより192.168.0.1:20000と192.168.0.2:20000はそれぞれ別のsocketに割り当てられ、別々にlisten出来ます。
(INADDR_ANYを使うと全てのローカルアドレスを使用しようとします)
apacheなどサーバソフトが設定でポートだけでなくアドレスを指定できるようにしているのはこのためです。

匿名質問者

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

2014/11/22 23:27:37
匿名質問者

上記の方法を実施した所、無事通信することを確認できました。
非常に助かりました。ありがとうございました。

2014/11/25 21:01:37

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません