Ads

目的

複数のIPを持ったWindowsクライアントから接続元IPを指定してリモートアクセスを行いたい。

用件

何を使う?

実装してみた

ポイントは以下の3点だよな。

自分のIPアドレスの列挙

適当にググったらすぐ分かった。↓こんな感じで取れるようだ。

ManagementScope scope = new ManagementScope("root\\cimv2");
scope.Connect();
ObjectQuery query = new ObjectQuery("Select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection collection = searcher.Get();
foreach (ManagementObject mo in collection)
{
  foreach (string ipAddress in (string[])mo.Properties["IPAddress"].Value)
  {
    comboBox1.Items.Add(ipAddress);
  }
}

接続元IPの指定方法

これに関しては情報が少なかったが、ipとかbindとかそれっぽいキーワードを頼りにMSDNとか調べたらそこそこすぐに見つかった。 WebRequestの接続時に呼ばれるデリゲートで差し替えるようだ。ところで僕の記憶よりC#も進化してて最近は無名delegateが使えるようになったんだね。便利だw

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(textBox1.Text);
//接続元IPの選択
//↓これに小さい値を設定しておかないと、IP切り替えてから別リクエストを実行しても
//↓アプリ内部で前回接続時のEndPointが再利用されてしまい接続元が変わらない罠に陥る
ServicePointManager.MaxServicePointIdleTime = 100;
request.ServicePoint.BindIPEndPointDelegate = delegate
{
  if (comboBox1.Text == "自動")
  {
    return new IPEndPoint(IPAddress.Any, 0);
  }
  else
  {
    return new IPEndPoint(IPAddress.Parse(comboBox1.Text), 0);
  }
};
//実行
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

この接続元IPの指定はやり方さえ分かればサクッと動いたかと思いきや、コメントに書いたとおり妙な罠があってこれの解決に時間がかかってしまった…。

こんなん出来ました。

使い方はみりゃ分かるだろってことで、ご自由に利用してください。

#ref(): File not found: "HQ1236340174.png" at page "Windowsで接続元IPを切り替えて接続する"

↓ソース&実行ファイルはこちら

fileHQ1236340174.zip

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS