メインのインターフェースは固定回線で、サブのインターフェースにモバイル回線をつなげており、同時に別々のインターフェースでアクセスしたいので以下のコードを試しました。
Windowsでデフォルトのルーティングがメイン回線のほうに設定してあるのでインターフェースを指定しない場合はメイン回線での通信となります。
ここでServicePointManager.MaxServicePointIdleTime = 0;
の行を入れない場合は同じServicePointオブジェクトが使いまわされてしまいどちらも最初に作られるモバイル回線を設定したServicePointが使われてしまうのですが、その行を入れるときちんと別々のServicePointオブジェクトが作られてServicePointのハッシュコードも別々となり別々のインターフェースでアクセスとなります。
なぜアイドル時間を0にするとServicePointが新たに作られるような動作になるのでしょうか。
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Net; 5using System.Text; 6using System.Text.RegularExpressions; 7using System.Threading.Tasks; 8 9namespace ConsoleApp9 10{ 11 internal class Program 12 { 13 static void Main(string[] args) 14 { 15 while (true) 16 { 17 Console.WriteLine("Start"); 18 ServicePointManager.MaxServicePointIdleTime = 0; 19 Test().Wait(); 20 Console.WriteLine("Done"); 21 Console.ReadLine(); 22 } 23 } 24 25 static async Task Test() 26 { 27 Task task = null; 28 29 // 1回目のリクエスト(インターフェース指定あり) 30 { 31 HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://www.cman.jp/network/support/go_access.cgi"); 32 req.Proxy = null; 33 34 // インターフェースを指定 35 req.ServicePoint.BindIPEndPointDelegate = delegate ( 36 ServicePoint servicePoint, 37 IPEndPoint remoteEndPoint, 38 int retryCount) 39 { 40 return new IPEndPoint(new IPAddress("192.168.42.252".Split('.').Select(s => byte.Parse(s)).ToArray()), 0); 41 }; 42 43 task = new Task(new Action(() => 44 { 45 Console.WriteLine("[1]Start"); 46 Console.WriteLine("[1]Hash=" + req.ServicePoint.GetHashCode()); 47 48 string htmlSource; 49 using (var webres = (HttpWebResponse)req.GetResponse()) 50 using (var st = webres.GetResponseStream()) 51 using (var sr = new System.IO.StreamReader(st, Encoding.UTF8)) 52 { 53 htmlSource = sr.ReadToEnd(); 54 } 55 56 Console.WriteLine("[1]" + Regex.Match(htmlSource, @"\d+.\d+.\d+.\d+").Value); 57 })); 58 59 task.Start(); 60 } 61 62 // 1回目が通信中に2回目が接続するように少し待つ 63 await Task.Delay(50); 64 65 // 2回目のリクエスト(インターフェース指定なし) 66 { 67 HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://www.cman.jp/network/support/go_access.cgi"); 68 req.Proxy = null; 69 70 Console.WriteLine("[2]Start"); 71 Console.WriteLine("[2]Hash=" + req.ServicePoint.GetHashCode()); 72 73 string htmlSource; 74 using (var webres = (HttpWebResponse)req.GetResponse()) 75 using (var st = webres.GetResponseStream()) 76 using (var sr = new System.IO.StreamReader(st, Encoding.UTF8)) 77 { 78 htmlSource = sr.ReadToEnd(); 79 } 80 81 Console.WriteLine("[2]" + Regex.Match(htmlSource, @"\d+.\d+.\d+.\d+").Value); 82 } 83 84 // 非同期の1回目リクエストが終わるのを待つ 85 await task; 86 } 87 } 88}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/11 03:24
2022/05/11 03:35
2022/05/11 13:37
2022/05/11 15:09
2022/05/11 15:10
2022/05/11 23:56