【问题标题】:C# UDP broadcast client/server does not workC# UDP 广播客户端/服务器不起作用
【发布时间】:2010-11-12 11:12:19
【问题描述】:

我正在使用 .NET 2.0 并创建了一个相当简单的 udp 广播应用程序和 UDP 侦听器。

监听代码:

Socket listener = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp );
IPEndPoint localEndPoint = new IPEndPoint( IPAddress.Any, 11000 );
listener.Bind( localEndPoint );
EndPoint ep = (EndPoint)localEndPoint;
Console.WriteLine("Ready to receive…");
byte[] data = new byte[1024];
int recv = listener.ReceiveFrom(data, ref ep);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString());
listener.Close();

服务器代码:

int groupPort = 11000;
IPEndPoint groupEP = new IPEndPoint( IPAddress.Parse( "255.255.255.255" ), groupPort );

if ( radioButton2.Checked )
{
    groupEP = new IPEndPoint( IPAddress.Broadcast, groupPort );
}
    else if ( radioButton3.Checked )
{
    groupEP = new IPEndPoint( IPAddress.Parse( "172.16.75.15" ), groupPort );
}

Socket socket = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp );
socket.SetSocketOption( SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1 );
socket.SendTo( System.Text.ASCIIEncoding.ASCII.GetBytes( testTextBox.Text ), groupEP );

服务器只是一个简单的 Windows 应用程序,带有 3 个单选按钮、按钮和一个文本框。

当我在单独的计算机上运行服务器并选择 radioButton3 时,我在客户端侦听器(在 ip 地址 172.16.75.15 上运行)上接收到消息就好了。但是,如果我选择第一个或第二个单选按钮(创建广播或 255.255.255.255 作为 IP 地址),我什么也得不到。现在,如果我在与服务器相同的电脑上运行客户端,我可以使用这两个选项接收消息。

我不确定我做错了什么,或者是否有某种防火墙阻止了 LAN 上的 UDP 消息。有什么想法吗?

谢谢,

克雷格

【问题讨论】:

  • Craig:如果您使用的是 VB.NET,也许它会起作用?
  • 您可以做的一件事是检查数据包是否从网络上传出,以了解它是客户端问题还是服务器问题。安装网络监视器,如wireshark 并监视您的局域网。
  • 是的,但这不适用于 C#。克雷格是这么说的。
  • John,C#/VB.NET cmets 是怎么回事?有问题吗?

标签: c# sockets udp broadcast


【解决方案1】:

在我的情况下,255.255.255.255 由于 Teamviewer VPN 驱动程序而无法工作,在网络连接中。我使用子网掩码是因为我必须找到设备而不是静态 ip,因为 DHCP 经常更改 ip。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,我在这里看到的所有代码似乎都没有工作。 当我启动我的程序时,会弹出这个防火墙窗口,告诉您防火墙已阻止某些功能。

    我的问题是我点击了允许访问,但没有勾选“私人网络,就像我的家庭或工作网络一样糟糕”的复选框。您当然可以稍后在防火墙设置中更改此设置并勾选该复选框。 de 服务器和另一台机器都必须选中该复选框。或者至少这就是我的工作的原因。

    我还必须将我的广播 IP 地址更改为例如 192.168.1.255。我的路由器确实屏蔽了我的书推荐的 224.0.0.0 - 239.255.255.255;

    【讨论】:

      【解决方案3】:

      Craig,我开发了一个 C# udp 客户端/服务器工具,使用广播,它可以工作(数据报被同一子网上的所有客户端接收)。只是avoid 255.255.255.255,windows 不能总是走正确的路线。您必须帮助 windows 指定正确的子网。服务器:将 udp 套接字绑定到 172.16.75.15,并发送到本地广播地址(您确定是 172.16.75.255 吗?检查您的子网掩码)。

      【讨论】:

        【解决方案4】:

        我刚刚尝试了您的代码并为我工作。我唯一更改的是 IPAddress 以匹配我的服务器本地 IP 地址。

        【讨论】:

          【解决方案5】:

          客户端和服务器在同一个物理网络上吗?如果没有,您将无法进行本地广播 (255.255.255.255),需要进行定向子网广播。您必须先启用路由器以允许定向子网广播 (172.16.75.255),然后才能正常工作。

          【讨论】:

            【解决方案6】:

            请注意,但如果您是从头开始编写新应用程序,那么您真的应该使用多播而不是广播。

            【讨论】:

            • 组播的优点:网络更友好,因为只有那些加入组的人才能在他们的 IP 堆栈中看到您的数据包,路由器不太可能阻止它。多播的缺点:设置套接字需要做更多的工作。广播的优点:设置套接字很简单。广播的缺点:在您的 TTL 跃点限制内的每台机器都必须处理该消息,路由器倾向于阻止来自跳跃子网的广播。
            • 我不同意。我用 udp 广播管理 1200 个 pc 客户端,它们在同一个子网上。 Dhcp 使用 udp 广播,也通过不同的子网(需要带 dhcp 中继的路由器)。这取决于您的设计和目标……而且并非总是在路由器上进行多播!
            【解决方案7】:

            仅在本地子网上尝试广播。 IE 如果您的子网是 255.255.255.0,请尝试广播 172.16.75.255。可能是 Windows、路由器甚至网卡自动阻止通用广播作为预防措施。

            【讨论】:

            • 大多数路由器/交换机/等默认阻止广播的传播。
            • 我试过 172.16.75.255 广播也失败了。乔希,你很可能是对的。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-24
            • 1970-01-01
            • 2012-07-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多