выберите NIC (сетевую карту) для прослушивателя UDP - PullRequest
0 голосов
/ 17 декабря 2018

Я хотел бы связать сетевой адаптер для прослушивания определенного порта с определенного IP-адреса.Я настроил внутренний процесс отправки / получения в своем коде для тестирования.Мне удалось разрешить прослушивание настраиваемого значения порта и поставить проверки, чтобы убедиться, что он получает только с определенного IP-адреса.Моя проблема в том, что когда я настраиваю свою конечную точку в качестве значения NIC, я могу получать только сообщения, отправленные на этот IP.Возможно, мне не хватает понимания UDP, но, как мне кажется, от меня ожидают, что я связываю сетевой адаптер, чтобы выбрать его в качестве устройства, на котором должен быть принят пакет, но он должен иметь возможность принимать отправляемый пакет.скажем, транслируемый IP.Может быть, это в корне неверно, но вот мой код.

Если это невозможно, и необходимо назначить IP NIC для отправки со стороны отправителя, объясните, в противном случае кто-то может посоветоватьмне, как связать мой NIC, но все еще смотрю, чтобы получать пакеты, отправленные на другие IP-адреса.

, так вот мой получатель

public void StartListening()
    {
        if (init == true)
        {
            running = true;
            listenEndpoint = new IPEndPoint(Variables.NICIP, Variables.ListenPort);
            udp = new UdpClient(listenEndpoint);
            init = false;
        }

        if (running == true)
        {
            this.udp.BeginReceive(Receive, new object());
        }
    }
    private void Receive(IAsyncResult ar)
    {
        IPEndPoint ip1 = null;
        byte[] bytes1 = null;

        if (running == true)
        {
            bytes1 = udp.EndReceive(ar, ref ip1);

            if (ip1.Address.Address == Variables.IPValue.Address)
            {
                string message = Encoding.ASCII.GetString(bytes1);

                Submit = message;
                Console.WriteLine(message);

            }
        }
        StartListening();
    }

    public void Destructor()
    {
        running = false;
        udp.Close();

    }

, а вот мой временный отправитель

private void button1_Click(object sender, EventArgs e)
    {
        Sender hereItComes = new Sender();
        hereItComes.Send();
    }
    public class Sender
    {
        public void Send()
        {
            UdpClient client = new UdpClient();

            IPEndPoint ip = new IPEndPoint(Variables.NICIP, Variables.ListenPort);
            byte[] bytes = Encoding.ASCII.GetBytes("Foo");
            client.Send(bytes, bytes.Length, ip);
            client.Close();
        }
    }
}

В идеале я хотел бы поместить любое допустимое значение IP в Variables.NICIP ->, который является IP-адресом NIC, который я назначил, и этот NIC получит пакет.Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 17 декабря 2018

Вам нужно будет определить, является ли адрес многоадресным или нет, а затем использовать что-то вроде JoinMulticastGroup.См. https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.udpclient.joinmulticastgroup?view=netframework-4.7.2 о присоединении к группе, а затем Как проверить, находится ли IP-адрес в определенной подсети , чтобы определить, является ли адрес многоадресным и т. Д.

См. Также https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.enablebroadcast?view=netframework-4.7.2

Если на маршрутизаторе выполняется многоадресная рассылка на одноадресную рассылку, то вам не нужно присоединяться к групповому биту, просто выполните привязку, прослушивание и отправку на заданный адрес, как вы уже это делаете.

См. Комментарии к версиям этих методов, которые я написал для использования в моих библиотеках.

Ps Не забывайте покидать группу, если вы присоединитесь к ней, поскольку будет продолжаться попытка доставки трафика даже после вашего сокета.в большинстве случаев закрывается, если вы этого не сделаете.

Не забудьте, отправляете ли вы что-либо обратно, чтобы использовать флаг DontRoute, если у вас несколько сетевых карт.

...