2011-05-03 84 views
0

几天前,我问了一个question关于通过特定的网络适配器发送HttpWebRequest,有人告诉我使用BindIPEndPointCallback。我试过这个:通过特定的网络适配器发送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(); 
} 

但它仍然不起作用。它通过相同的网络适配器发送HttpWebRequest。 还有什么我可以尝试吗?

+0

是回调invokd?它返回什么? – jgauffin 2011-05-03 13:42:58

+0

是的,它被调用并返回一个IPEndPoint对象 - 192.168.50.103:0 – Ephi 2011-05-03 14:20:03

回答

0

如果您的本地终点是private ip address(192.168.50.103是),你的路由器会将该地址转换为不同的公共IP,这是whatsmyip可以看到的地址。

我建议你试试这个例子:

using System; 
using System.Net; 

class Program 
{ 
    public static void Main() 
    { 
     // TODO: Put your ip addresses in this list 
     var ips = new IPAddress[] 
     { 
      IPAddress.Parse("10.0.0.3"), 
      IPAddress.Parse("192.168.1.7") 
     }; 

     foreach (var ip in ips) 
     { 
      try 
      { 
       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(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
     } 
    } 
}