【问题标题】:Send broadcast message from all network adapters从所有网络适配器发送广播消息
【发布时间】:2010-10-01 00:12:56
【问题描述】:

我有一个发送广播消息并侦听响应数据包的应用程序。下面是代码sn-p。

m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
m_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);

m_socket.Bind(new IPEndPoint(IPAddress.Any, 2000));

m_socket.BeginSendTo(
                    buffer, 
                    0, 
                    buffer.Length, 
                    SocketFlags.None,
                    new IPEndPoint(IPAddress.Broadcast, 2000),
                    Callback), 
                    null
                    );

当我运行应用程序时,没有发送广播消息。在我的机器上,我有三个网络适配器。一个是我的本地网络适配器,另外两个是 VMWare 网络虚拟适配器。当我运行我的应用程序时,我可以看到(使用 wireshark 网络捕获)广播消息是从 VMWare 网络适配器之一发送的。

我想修改代码,以便从电脑上的所有网络适配器发送广播消息。最好的方法是什么?

【问题讨论】:

  • 你能解决你的问题吗?

标签: c# .net sockets


【解决方案1】:

您可以使用以下方法获取所有 IP 地址(以及更多)。因此,当您发送多播时,您可以遍历列表并绑定(如 Jon B 所说)到您想要的特定 IP。

foreach (var i in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
    foreach (var ua in i.GetIPProperties().UnicastAddresses)
        Console.WriteLine(ua.Address);

【讨论】:

    【解决方案2】:

    当您调用 Bind() 时,您正在设置本地 IP 端点。不要使用 IPAddress.Any,而是使用您要从中发送的 NIC 的 IP 地址。您需要为每个 NIC 单独执行此操作。

    【讨论】:

      【解决方案3】:

      检查此http://salaam.codeplex.com/ 我和我的朋友开发了一个名为 Salaam 的类库。下载源代码或使用二进制文件(.dll)来使用它。

      【讨论】:

        【解决方案4】:

        您可以在构造 tcpListener 时使用 IPAddress.Any。这会将 tcp 监听器绑定到所有接口

        【讨论】:

        • 我无法确认。
        • OP 要求的是广播,而不是听众
        猜你喜欢
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多