Установка локальной конечной точки сокета - PullRequest
7 голосов
/ 02 октября 2009

Мне нужно создать сокет, который подключается к процессу сервера, но должен быть ограничен использованием указанного локального адаптера. Поведение по умолчанию - использовать все, что может, но мне нужно убедиться, что данный сокет только пытается (например) подключиться к локальной сети, если доступны как wifi, так и локальная сеть.

Я использую C # и .NET 2.0.

Приветствия

Ответы [ 3 ]

14 голосов
/ 02 октября 2009

Метод Socket.Bind(EndPoint localEP) - ваш друг. Посмотрите здесь на MSDN для деталей.

Чтобы получить все локальные адаптеры и их тип, посмотрите на System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()

6 голосов
/ 11 февраля 2010

Что касается других, у меня возникла проблема с использованием Bind, потому что я использовал класс UdpClient и обращался к его внутреннему сокету (через UdpClient.Client), который генерировал исключение SocketException, независимо от того, как я пытался связать. Мой обходной путь основан на создании и привязке Socket, а затем назначении его экземпляру 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 голосов
/ 02 октября 2009

Не могли бы вы попробовать использовать функцию bind ()? Может быть, это поможет.

На MSDN я обнаружил, что:

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

Примечания

Функция привязки требуется на неподключенный сокет перед последующим вызовы функции прослушивания. это обычно используется для привязки к любому ориентированный на соединение (поток) или розетки без соединения (дейтаграммы). функция связывания также может быть использована для связывания в сырую розетку (розетка была создается путем вызова функции сокета с параметром типа, установленным на SOCK_RAW). Функция связывания может также использоваться на неподключенной розетке до последующих звонков на connect , ConnectEx, WSAConnect, WSAConnectByList или WSAConnectByName функции перед отправкой.

Когда сокет создается с помощью вызова к функции сокета, он существует в пространство имен (адрес семьи), но оно имеет имя ему не присвоено. Используйте привязку функция для установления местного связывание сокета путем назначения локальное имя для безымянного сокета.

Имя состоит из трех частей, когда используя семейство интернет-адресов: адрес семьи. Адрес хоста. Порт номер, который идентифицирует применение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...