下記の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上で、同じポート番号のソケットを作成するのはできないと思っています。
今のところ、一台のコンピュータで仮想マシンを二台立ち上げる方法を考えていますが、
それ以外に上手い方法はあるでしょうか?
非常に困っているため、是非力を貸してもらえると幸いです。
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などサーバソフトが設定でポートだけでなくアドレスを指定できるようにしているのはこのためです。
ご回答ありがとうございます。
2014/11/22 23:27:37なるほどサーバソケットのaddr.sin_addr.s_addrの値は、クライアントのIPアドレスではなく、サーバのアドレスなのですね。勘違いしていました。
上記の方法を試してみたいと思います。
結果が確認できたらもう一度報告させて頂きます。
貴重な情報ありがとうございましたm(_ _)m
上記の方法を実施した所、無事通信することを確認できました。
2014/11/25 21:01:37非常に助かりました。ありがとうございました。