Как я могу отправить UDP себе на одну сетевую карту и получить на другую сетевую карту? - PullRequest
0 голосов
/ 06 февраля 2019

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

Из того, что я прочитал, если я хочу связать сетевой адаптер, с которого я хочу отправлять, я должен либо использовать конструктор udpclient, подключитьсяметод или метод привязки сокета.Я пробовал все это и буду включать примеры в мой код.Если я не установлю UDPclient на то же значение или не свяжу сокет одинаково, пакет никогда не будет получен.Если это так, как это должно быть, то как мне связать другой NIC для отправки с.

вот код получателя

    public void StartListening()
    {
        if (init == true)
        {
            running = true;

            //Props.NICIP = NIC of reciever, listenport is recievers port

            listenEndpoint = new IPEndPoint(Props.NICIP, Props.ListenPort);

            //creates UDP client with set out NIC ip and a decided port
            udp = new UdpClient(listenEndpoint);
            init = false;
        }

        if (running == true)
        {
            this.udp.BeginReceive(Receive, new object());
        }
    }

    private void Receive(IAsyncResult ar)
    {
        //reference ip from sender
        IPEndPoint ip1 = null;

        byte[] bytes1 = null;

        if (running == true)
        {
            //array of bytes recieved for subission
            bytes1 = udp.EndReceive(ar, ref ip1);

            //check to see that ip of recieved packet, is from specified 
            //NIC of sender
            if (ip1.Address.Address == Props.IPValue.Address)
            {

                BSubmit = new Byte[220];
                BinSubmit = bytes1;

            }
        }

        StartListening();
        }

вот код отправителя

    public class Sender
    {
        //this sets up NIC of Sender
        IPEndPoint ip2 = new IPEndPoint(new IPAddress(new byte[] 
        { 10, 0, 101, 67 }), 200);


        Socket sock = new Socket(AddressFamily.InterNetwork, 
        SocketType.Dgram, ProtocolType.Udp);

        static int z = 0;

        public void Send()
        {
            //insures dont try use same port twice
            if (z == 0)
            {
                // binds NIC of reciever to socket
                sock.Bind(ip2);
                z++;
            }

            //states the NIC and port of the Receiver
            IPEndPoint endPoint = new IPEndPoint(Props.NICIP, 
            Props.ListenPort);

            byte[] bytes = new byte[500];

            bytes[8] = 5;
            bytes[9] = 6;

            //intention is to send from socket bound to sender NIC,
            // to reciever IP and port determined by endPoint
            sock.SendTo(bytes, endPoint);


            ////////////this is the udpclient version of the code/////////
            //
            //   //binds NIC of sender to UDP client
            //  IPEndPoint ip2 = new IPEndPoint(new IPAddress(new byte[] 
            //  { 10, 0, 101, 67 }),200);
            //
            //
            //   //states NIC and port of reciever
            //   IPEndPoint ip = new IPEndPoint(Props.NICIP, 
            //   Props.ListenPort);   
            //
            //   UdpClient client = new UdpClient(ip2);
            //////////////////////////////////////////////////////

            //////////////UDP CLIENT VERSION//////////////////
            //
            //  //intention is to send to ip, which defines recievers NIC 
            //  //and port, from client, which is bound to Sender NIC          
            //            client.Send(bytes, bytes.Length, ip);
            //            client.Close();
            /////////////////////////////////////////////////
        }
    }

}

Ожидаемый результат заключается в том, что получатель должен забрать отправленное ему сообщение, определенное ipEndPoint отправителя.затем либо разрешить доступ в зависимости от того, пришел ли пакет с предполагаемого сетевого адаптера, отфильтрованного по этой проверке "(ip1.Address.Address == Props.IPValue.Address)".

Что произойдет, если пакет не будет получен, пока я не установлю привязку сокета или конструктора / соединения UDPClient отправителя к IP-адресу сетевой карты получателя.Значение порта может отличаться, и сообщения по-прежнему принимаются, но IP-адрес должен оставаться прежним.

Я не знаю, есть ли у меня фундаментальное недопонимание о том, как привязать мой сетевой адаптер к отправителю или получателю, или есть что-то еще, что я полностью упускаю.Любая помощь будет высоко ценится.

...