9
votes

Définir le point d'extrémité local d'un socket

Je dois créer une prise qui se connecte à un processus de serveur, mais doit être limitée à l'utilisation d'un adaptateur local spécifié. Le comportement par défaut consiste à utiliser ce qu'il peut, mais je dois m'assurer qu'une prise donnée n'essaie que (par exemple), la connexion LAN, si une connexion Wi-Fi et LAN sont disponibles.

J'utilise C # et .NET 2.0.

acclamations


0 commentaires

3 Réponses :


0
votes

Pourriez-vous essayer d'utiliser la fonction BIND ()? Peut-être que cela ferait l'affaire.

sur MSDN, j'ai trouvé que:

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

remarques

La fonction de liaison est requise sur un prise non connectée avant la suite Appels à la fonction d'écoute. Il est normalement utilisé pour se lier à axé sur la connexion (courant) ou prises sans connexion (datagram). Les La fonction de liaison peut également être utilisée pour se lier à une prise crue (la prise était Créé en appelant la fonction de prise avec le paramètre type défini sur Sock_raw). la fonction de liaison peut également être utilisé sur une prise non connectée avant les appels ultérieurs vers le Connectez , Connectex, WSAConnect, Wsaconnectbyliste, ou wsaconnectbyname fonctions avant d'envoyer des opérations.

Lorsqu'un socket est créé avec un appel à la fonction de prise, il existe dans un Espace de noms (famille d'adresses), mais il a aucun nom qui lui est attribué. utiliser la liaison fonction pour établir le local Association de la prise en attribuant un nom local à une prise non nommée.

Un nom se compose de trois parties lorsque Utilisation de la famille d'adresses Internet: le Adresse famille. Une adresse hôte. Un port nombre qui identifie le application.


1 commentaires

BIND () est la bonne méthode à regarder, mais l'OP demande c #.



15
votes

1 commentaires

Cela devrait être system.net.networkinformation.networkinterface.getallNetwork interfaces ().



6
votes

Pour la référence des autres, j'avais un problème à l'aide d'une liaison, car j'utilisais la classe UDPCLIent et accédant à sa prise interne (via udpclient.client) qui lancerait une socketException, peu importe la façon dont j'ai essayé de lier. Mon Solution de contournement repose sur la création et la liaison de la prise d'abord, puis l'affectation à l'instance 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);
    }
}


0 commentaires