【问题标题】:Problem Trying to unicast packets to available networks尝试将数据包单播到可用网络时出现问题
【发布时间】:2009-07-08 06:58:30
【问题描述】:

尝试将数据包单播到可用网络。总共有3个网络。只能在一个网络中获取数据包。但是我无法在不同的网络中接收数据包。

使用此代码..

        foreach (var i in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
        {
            foreach (var ua in i.GetIPProperties().UnicastAddresses)
            {
                System.Windows.Forms.MessageBox.Show(ua.Address.ToString());
                IPAddress Tip = IPAddress.Parse(ua.Address.ToString());
                IPEndPoint targetEndPoint = new IPEndPoint(Tip, iTargetPort);
                MyUdpClient sendUdpClient = new MyUdpClient();
                int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);
            }
        }

问题是什么?谢谢。

【问题讨论】:

    标签: c# udp udpclient multihomed


    【解决方案1】:

    我认为您是在尝试向自己发送数据包?

    您确定没有混淆单播和多播地址吗?

    好的,所以你不尝试多播...

    您的每个网络接口都有一个 IP 地址。您在这里所做的是将数据包发送到您的网卡。这实际上不是网络问题,因为您的机器很可能知道自己的 IP 地址并将其重新路由到 127.0.0.1

    【讨论】:

    • 是的,埃里克,我确定。我想将数据包单播到可用的网络适配器。我猜上面的代码就是这样做的。我没有收到任何错误。我能够获取所有网络地址并将数据包发送给他们。但是在不同的网络适配器中没有收到IP地址中的数据包。代码应该能够单播到所有可用的网络适配器。
    【解决方案2】:

    由于您有多个接口,因此您是多宿主的。对于每个接口,您将拥有一个 IP 地址。因此,使用三个接口,您将拥有三个本地 IP。当您使用 UdpClient 时,您需要使用它的 IP 指定发送哪个接口。

    假设您有以下三个本地 IP

    10.1.0.1
    10.2.0.1
    10.4.0.1
    网络掩码为 255.255.0.0

    如果您想向 10.2.5.5 发送 UDP 数据包,则需要将其发送到 10.2.0.1,因此请使用以下代码

    IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("10.2.0.1"), 0);
    IPEndPoint targetEndPoint = new IPEndPoint(IPAddress.Parse("10.2.5.5"), iTargetPort);
    UdpClient sendUdpClient = new UdpClient(localEndPoint);
    int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);
    

    要将 UDP 数据包发送到 10.1.90.5,您需要将其发送到 10.1.0.1,因此请使用以下代码

    IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("10.1.0.1"), 0);
    IPEndPoint targetEndPoint = new IPEndPoint(IPAddress.Parse("10.1.90.5"), iTargetPort);
    UdpClient sendUdpClient = new UdpClient(localEndPoint);
    int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);
    

    两者的区别是localEndPoint和targetEndPoint。

    【讨论】:

      【解决方案3】:

      我不是网络专家,但我会尝试尝试一下。我假设所有数据包都通过默认接口发送,该接口知道三个地址:它自己的、环回和网关。因此,从 192.168.1.111 到 10.10.1.117 的数据包需要通过默认网关(假设这是 192.168.1.1),但如果 192.168.1.1 不知道到 10.10.0.0 的路由怎么办,那么目标主机遥不可及对吗?我不知道,这是我的猜测。

      虽然,也许我错了。也许它不使用默认设备,而是使用所有可用接口以及 TCP/IP 堆栈。无论如何,我很想看看你发现了什么。请随时更新。

      此外,记下地址可能会有所帮助。跟踪路线是您的朋友。

      【讨论】:

        猜你喜欢
        • 2016-09-11
        • 2020-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-24
        • 2020-03-16
        • 1970-01-01
        相关资源
        最近更新 更多