2009-10-02 8 views
7

Ich muss einen Socket erstellen, der eine Verbindung zu einem Serverprozess herstellt, aber auf die Verwendung eines angegebenen lokalen Adapters beschränkt sein muss. Das Standardverhalten ist, was immer es kann, aber ich muss sicherstellen, dass ein gegebenes Socket nur die LAN-Verbindung (zum Beispiel) versucht, wenn sowohl WLAN als auch LAN verfügbar sind.Festlegen des lokalen Endpunkts eines Sockets

Ich verwende C# und .NET 2.0.

Beifall

Antwort

0

Man könnte versuchen, bind() Funktion zu benutzen? Vielleicht würde dies den Trick tun.

(http://msdn.microsoft.com/en-us/library/ms737550(VS.85).aspx)

Bemerkungen

Die bind Funktion ist an einer unverbundenen Steckdose, bevor nachfolgende Anrufe an die hören Funktion erforderlich:

Auf Msdn habe ich gefunden. Es wird normalerweise verwendet, um an verbindungsorientierte (Stream) oder verbindungslose (Datagramm) Sockets zu binden. Die Bindungsfunktion kann auch verwendet werden, um an einen Raw-Socket zu binden (der Socket war , der durch Aufrufen der Socket-Funktion mit dem Typparameter set auf SOCK_RAW erstellt wurde). die BIND-Funktion kann auch mit dem verbinden, ConnectEx, WSAConnect, WSAConnectByList oder WSAConnectByName Funktionen vor senden Operationen bevor nachfolgende Anrufe auf einem nicht verbundenen Buchse verwendet werden.

Wenn eine Buchse mit einem Aufruf an die Socket-Funktion erstellt wird, existiert es in einer Namensraum (Adressfamilie), aber es hat keinen Namen zugewiesen. Verwenden Sie die Funktion bind , um die lokale -Zuordnung des Sockets einzurichten, indem Sie einem nicht benannten Socket einen lokalen Namen zuweisen.

Ein Name besteht aus drei Teilen, wenn die Internet-Adressfamilie verwendet: Die Adressfamilie. Eine Hostadresse. Ein Port Nummer, die die Anwendung identifiziert.

+0

bind() ist die richtige Methode zu suchen, aber die OP für C# bittet. –

3

Für den Bezug von anderen zu bekommen, war ich ein Problem mit Bind mit, weil ich die UdpClient Klasse wurde mit und seine internen Socket-Zugriff (via UdpClient.Client) was würde eine SocketException werfen, egal wie ich versuchte zu binden. Meine workaround stützt sich auf das Erstellen und Binden der Sockel zuerst, dann es auf die UdpClient Instanz zuweisen:

using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) 
{ 
    var endPoint = new IPEndPoint(ip, port); 
    socket.Bind(endPoint); 
    using (var client = new UdpClient() {Client = socket}) 
    { 
     var destinationIP = IPAddress.Broadcast; 
     client.Connect(destinationIP, port); 
     client.Send(bytes, bytes.Length); 
    } 
} 
Verwandte Themen