【问题标题】:choose a NIC (network interface card) for UDP listener为 UDP 监听器选择一个 NIC(网络接口卡)
【发布时间】:2019-05-17 09:30:32
【问题描述】:

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

如果无法做到,并且必须指定网卡的IP从发送方发送,请解释一下,否则有人可以告诉我如何绑定我的网卡但仍然希望接收其他发送的数据包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 将接收数据包。任何帮助将不胜感激。

【问题讨论】:

    标签: c# forms asynchronous udp nic


    【解决方案1】:

    您必须确定地址是否为多播,然后使用 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

    如果在路由器上执行多播到单播,那么您不需要加入组位,只需绑定和侦听并发送到您已经在做的设计地址。

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

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

    如果您有多个 NIC,请不要忘记发送回任何内容以使用 DontRoute 标志。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 2012-05-01
    • 2013-11-05
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    相关资源
    最近更新 更多