前提

現在以下の構成で TCP サーバアプリケーションを作成しています。

PC(クライアント)<──インターネット──>ロードバランサ ───────サーバ1
                        │─────────────────────────────サーバ2
                        │─────────────────────────────サーバ3

サーバアプリケーションとしては .NET Framework の Socket クラスを使用しています。

ソケットクラスに指定しているパラメタとしては

  • AddressFamily#InterNetwork
  • SocketType#Stream
  • ProtocolType#Tcp

インスタンス生成時、上記を設定( TCP 送受信設定)しています。

また、環境は以下です。

  • クライアント PC:Windows 7
  • サーバ:Windowws Server2012
  • ロードバランサ:BIG-IP
  • 開発言語:C++/CLI
  • 実行環境:.NET Framework 4.5
  • プログラム作成環境:Visual Studio Pro 2012

質問事項

以下のコードで、本来は接続されたクライアントのIPアドレスを取得出来る想定でしたが、ロードバランサのIPアドレスが取得されます。

以下擬似コード

Socket ClientSocket = ServerSocket.EndAccept(iAsyncResult);
String IpAddress = ((IPEndPoint)ClientSocket.RemoteEndPoint).Address.ToString();
Console.WriteLine(IpAddress);

--------------
出力結果:ロードバランサのIPアドレス
--------------

WireShark を使用してパケットモニタリングし、調査した結果、 IP ヘッダにはクライアント PC のIPアドレスが入っていることがわかりました。おそらく、プログラムで取得するやり方が悪いのだと思われるのですが、 IP ヘッダに記載されている IP アドレスを取得する方法がわかりません。

少しでも良いのでヒントになる情報があれば、ご教授くださると助かります。