2011-05-02 9 views
9

Tengo dos adaptadores de red inalámbricos conectados a mi computadora, cada uno conectado a una red diferente. Me gustaría construir un tipo de servidor proxy al que mi navegador se conectara y enviará solicitudes HTTP desde adaptadores diferentes, por lo que el tiempo de carga en las páginas web sería menor. ¿Ustedes saben cómo puedo decidir desde qué adaptador de red enviar HttpWebRequest?Envío de HttpWebRequest a través de un adaptador de red específico

Gracias :)

ACTUALIZACIÓN

He utilizado este código:

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(); 
} 

Pero incluso si un cambio del IPEndPoint que envía la dirección IP que recibo de WhatIsMyIp sigue siendo el mismo. . ¿alguna ayuda?

+0

¿Se está conectando a través de un proxy? –

Respuesta

6

BindIPEndPointDelegate bien puede ser lo que buscas aquí. Le permite forzar una IP local particular para que sea el punto final a través del cual se envía la HttpWebRequest.

+0

@Ephi: no hay problema, me alegro de poder ayudar. Acepta mi respuesta si estás seguro de que estás contento con ella. –

+0

@ Will-A He editado mi pregunta, ¿me pueden ayudar? – Ephi

+0

Sí, puede usar 'BindIPEndPointDelegate' a través de la propiedad' ServicePoint' en 'HttpWebRequest' para elegir desde qué adaptador enviar la solicitud. La respuesta aceptada a esta pregunta tiene un ejemplo de trabajo (http://stackoverflow.com/questions/3345387/how-to-change-originating-ip-in-httpwebrequest). – rsbarro

2

Este ejemplo funciona para mí:

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(); 
     } 
    } 
} 
0

Esto se debe a WebRequest utiliza ServicePointManager y se almacena en caché ServicePoint real que se ha utilizado por un solo URI. Por lo tanto, en su caso, BindIPEndPointDelegate solo se llamó una vez y todas las subsiguientes CreateRequest reutilizan la misma interfaz enlazada. Aquí hay un poco más de ejemplo de nivel inferior con TcpClient que realmente funciona:

 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); 
        } 
       } 
      } 
     } 
Cuestiones relacionadas