質問: 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上で、同じポート番号のソケットを作成するのはできないと思っています。 今のところ、一台のコンピュータで仮想マシンを二台立ち上げる方法を考えていますが、 それ以外に上手い方法はあるでしょうか? 非常に困っているため、是非力を貸してもらえると幸いです。
回答: 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などサーバソフトが設定でポートだけでなくアドレスを指定できるようにしているのはこのためです。