人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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/1件

▽最新の回答へ

1 ● 匿名回答1号
ベストアンサー

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

匿名質問者さんのコメント
上記の方法を実施した所、無事通信することを確認できました。 非常に助かりました。ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ