11
votes

Envoi de httpwebrequest via un adaptateur réseau spécifique

J'ai deux adaptateurs réseau sans fil connectés à mon ordinateur, chacun connecté à un réseau différent. Je souhaite construire une sorte de serveur proxy que mon navigateur se connecterait et il enverra des demandes HTTP de chaque adaptateur, de sorte que le temps de chargement sur les pages Web serait plus petit. Êtes-vous les gars-là, comment puis-je décider de quel adaptateur réseau à envoyer le httpwebrequest?

MERCI :)

MISE À JOUR

J'ai utilisé ce code: xxx

mais même si un changement ipendpoint, j'envoie l'IP que je reçois de Whaismyip est toujours le même. Toute aide?


1 commentaires

Vous connectez-vous via un proxy?


3 Réponses :


7
votes

BindipendPointDelegate peut bien être ce que vous 're après ici. Il vous permet de forcer une adresse IP locale particulière à être le point final via lequel le httpwebrequest est envoyé.


2 commentaires

@Ephi - pas de problème, content de pouvoir aider. Veuillez accepter ma réponse si vous êtes sûr que vous êtes heureux avec cela.


Oui, vous pouvez utiliser la propriété Bindipendpoingate via la propriété de la propriété sur httpwebrequest pour choisir quel adaptateur envoyer la demande de. La réponse acceptée à cette question a un exemple de travail ( stackoverflow.com/questions/3345387/... ).



6
votes

Cet exemple fonctionne pour moi:

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 commentaires

1
votes

Ceci est parce que le WebRequest utilise ServicePointManager et il met en cache le point de service actuel utilisé pour un seul URI. Donc, dans votre cas BindipendpointPointDelegate appelé une seule fois et que tous les quartiers ultérieurs réduisent la même interface contraignante. Voici un exemple de niveau un peu plus bas avec Tcpclient qui fonctionne réellement:

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


0 commentaires