2009-10-02 13 views
7

È necessario creare un socket che si connetta a un processo del server, ma deve essere limitato all'utilizzo di un adattatore locale specificato. Il comportamento predefinito è quello di utilizzare tutto ciò che può, ma devo assicurarmi che un dato socket provi solo (ad esempio), la connessione LAN, se sono disponibili sia la rete Wi-Fi sia la LAN.Impostazione dell'endpoint locale di un socket

Sto utilizzando C# e .NET 2.0.

Acclamazioni

risposta

0

Si potrebbe provare a utilizzare la funzione bind()? Forse questo sarebbe il trucco.

su MSDN ho trovato che:

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

Osservazioni

è richiesta la funzione bind su una presa non collegata prima delle successive chiamate alla funzione ascolto. È normalmente utilizzato per eseguire il binding a socket con connessione diretta (streaming) o senza connessione (datagramma) o con . La funzione di collegamento può essere utilizzata anche per collegare a un socket non elaborato (il socket è stato creato chiamando la funzione socket con il parametro type impostato su SOCK_RAW). La funzione bind può anche essere utilizzato su una presa scollegato prima delle successive chiamate al collegare, ConnectEx, WSAConnect, WSAConnectByName, o WSAConnectByName funzioni prima invia operazioni.

Quando un socket è creato con una chiamata alla funzione socket, esiste in una namespace (famiglia di indirizzi), ma non ha nessun nome assegnato. Utilizzare la funzione bind per stabilire l'associazione locale del socket assegnando un nome locale a un socket senza nome.

Un nome formato da tre parti quando utilizzando l'indirizzo Internet di famiglia: La famiglia indirizzo. Un indirizzo host Una porta numero che identifica l'applicazione .

+0

bind() è il metodo giusto per guardare, ma il PO sta chiedendo C#. –

3

per il riferimento di altri, ho avuto un problema utilizzando Bind perché stavo utilizzando la classe classe UdpClient e l'accesso alla relativa presa interna (via UdpClient.Client) che lancia una SocketException indipendentemente da come ho provato a legare. Il mio workaround si basa sulla creazione e vincolante la presa, poi assegnarlo alla istanza classe UdpClient:

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