为UDP侦听器选择一个NIC(网络接口卡)

时间:2018-12-17 01:38:46

标签: c# forms asynchronous udp nic

我想绑定一个NIC来侦听来自特定IP地址的特定端口。我已经在我的代码中设置了一个内部发送/接收过程以进行测试。我设法允许可配置的端口值进行监听,并进行检查以确保它仅从某个IP接收。我的问题是,将端点设置为NIC值时,我只能接收发送到该IP的消息。也许我缺乏对UDP的理解,但是我应该期望的是,我绑定了一个NIC,以选择它作为接收数据包的设备,但是它应该能够接收正在发送的数据包。可以说广播IP。也许这从根本上是错误的,但这是我的代码。

如果无法完成,并且必须指定要从发送方发送的NIC的IP,请进行解释,否则有人可以建议我如何绑定我的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->中,这是我指定的NIC的IP,并且该NIC将接收该数据包。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您必须确定该地址是否是多播的,然后使用类似JoinMulticastGroup的名称。请参阅https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.udpclient.joinmulticastgroup?view=netframework-4.7.2来加入该组,然后查看How to check if an IP address is within a particular subnet来确定该地址是否是多播等。

另请参阅https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.enablebroadcast?view=netframework-4.7.2

如果正在路由器上执行从多播到单播的广播,则无需加入组位,只需像已经做的那样简单地绑定并侦听并发送到设计的地址即可。

请参阅注释,以了解我为在库中使用而编写的这些方法的版本。

P.s。如果您加入该组,请不要忘记离开该组,因为在大多数情况下,即使您关闭了套接字,仍会继续尝试传递流量。

如果您有多个NIC,请不要忘记是否发回任何东西以使用DontRoute标志。