【问题标题】:Sending HttpWebRequest through a specific network adapter通过特定的网络适配器发送 HttpWebRequest
【发布时间】:2011-05-02 18:28:49
【问题描述】:

我有两个无线网络适配器连接到我的计算机,每个都连接到不同的网络。我想构建一种代理服务器,我的浏览器将连接到它,它会从不同的适配器发送 HTTP 请求,因此网页上的加载时间会更短。 你们知道如何决定从哪个网络适配器发送 HttpWebRequest 吗?

谢谢:)

更新

我使用了这个代码:

public static IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount)
{
    List<IPEndPoint> ipep = new List<IPEndPoint>();
    foreach (var i in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
    {
        foreach (var ua in i.GetIPProperties().UnicastAddresses)
            ipep.Add(new IPEndPoint(ua.Address, 0));
    }
    return new IPEndPoint(ipep[1].Address, ipep[1].Port);
}

private void button1_Click(object sender, EventArgs e)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://whatismyip.com");
    request.ServicePoint.BindIPEndPointDelegate = new BindIPEndPoint(BindIPEndPointCallback);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader sr = new StreamReader(response.GetResponseStream());
    string x = sr.ReadToEnd();
}

但即使我发送的 IPEndPoint 发生了变化,我从 WhatIsMyIp 获得的 IP 仍然相同.. 有什么帮助吗?

【问题讨论】:

  • 您是否通过代理连接?

标签: c# httpwebrequest


【解决方案1】:

BindIPEndPointDelegate 很可能就是您想要的。它允许您强制将特定的本地 IP 作为发送 HttpWebRequest 的端点。

【讨论】:

  • @Ephi - 没问题,很高兴我能帮上忙。如果您确定自己满意,请接受我的回答。
  • 是的,您可以通过ServicePoint 上的ServicePoint 属性使用BindIPEndPointDelegate 来选择从哪个适配器发送请求。这个问题的公认答案有一个工作示例 (stackoverflow.com/questions/3345387/…)。
【解决方案2】:

这个例子对我有用:

using System;
using System.Net;

class Program
{
    public static void Main ()
    {
        foreach (var ip in Dns.GetHostAddresses (Dns.GetHostName ())) 
        {
            Console.WriteLine ("Request from: " + ip);
            var request = (HttpWebRequest)HttpWebRequest.Create ("http://ns1.vianett.no/");
            request.ServicePoint.BindIPEndPointDelegate = delegate {
                return new IPEndPoint (ip, 0);
            };
            var response = (HttpWebResponse)request.GetResponse ();
            Console.WriteLine ("Actual IP: " + response.GetResponseHeader ("X-YourIP"));
            response.Close ();
        }
    }
}

【讨论】:

    【解决方案3】:

    这是因为 WebRequest 使用 ServicePointManager,它缓存了用于单个 URI 的实际 ServicePoint。因此,在您的情况下,BindIPEndPointDelegate 仅调用一次,并且所有后续 CreateRequest 都重用相同的绑定接口。下面是一个实际有效的 TcpClient 低级示例:

            foreach (var iface in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (iface.OperationalStatus == OperationalStatus.Up && iface.NetworkInterfaceType != NetworkInterfaceType.Loopback)
                {
                    Console.WriteLine("Interface: {0}\t{1}\t{2}", iface.Name, iface.NetworkInterfaceType, iface.OperationalStatus);
                    foreach (var ua in iface.GetIPProperties().UnicastAddresses)
                    {
                        Console.WriteLine("Address: " + ua.Address);
                        try
                        {
                            using (var client = new TcpClient(new IPEndPoint(ua.Address, 0)))
                            {
                                client.Connect("ns1.vianett.no", 80);
                                var buf = Encoding.UTF8.GetBytes("GET / HTTP/1.1\r\nConnection: close\r\nHost: ns1.vianett.no\r\n\r\n");
                                client.GetStream().Write(buf, 0, buf.Length);
                                var sr = new StreamReader(client.GetStream());
                                var all = sr.ReadToEnd();
                                var match = Regex.Match(all, "(?mi)^X-YourIP: (?'a'.+)$");
                                Console.WriteLine("Your address is " + (match.Success ? match.Groups["a"].Value : all));
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                        }
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2015-05-30
      • 2019-02-14
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 2014-06-08
      相关资源
      最近更新 更多