【问题标题】:UDP broadcast is never received - what's wrong with the code?从未收到 UDP 广播 - 代码有什么问题?
【发布时间】:2013-10-02 19:15:18
【问题描述】:

我正在尝试发送广播以联系我的应用程序的其他实例。我在 Mac 上的 Mono 3 控制台程序中运行下面的代码(但也在 Windows 上尝试了 VS2012)。但是,从未收到该消息。接收者只是坐在那里并在通话中阻塞

byte[] data = udpClient.Receive (ref endPoint);

编辑:

我试过了:

var recipient = new IPEndPoint (new IPAddress(new byte[] {192, 255, 255, 255}), 1667);

还添加了

udpClient.EnableBroadcast = true;

发件人。仍然:没有收到任何东西。 就是这样。有什么建议吗?

using System;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace NetworkServiceTest_Console
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Task.Run (() => Receiver ());
            Task.Run (() => {
                while(true)
                {
                    Sender ();
                    Thread.Sleep(1000);
                }
            });



            Console.ReadLine ();
        }

        static void Sender()
        {
            Console.WriteLine ("Sending...");
            var recipient = new IPEndPoint (IPAddress.Broadcast, 667);
            var udpClient = new UdpClient ();

            var data = Encoding.UTF8.GetBytes("Hallo world!");
            int bytesSent = udpClient.Send (data, data.Length, recipient);
            udpClient.Close ();
            Console.WriteLine ("{0} bytes sent", bytesSent);
        }

        static void Receiver()
        {
            Console.WriteLine ("Receiving...");
            var udpClient = new UdpClient ();
            var endPoint = new IPEndPoint(IPAddress.Any, 667);
            byte[] data = udpClient.Receive (ref endPoint);
            Console.WriteLine ("Received '{0}'.", Encoding.UTF8.GetString (data));
            udpClient.Close ();
        }
    }
}

【问题讨论】:

  • 它在构造函数调用时挂起?还是程序崩溃了?您是否将调用封装在 try/catch 中以查看它是否引发异常?
  • @JimMischel 我修改了这个问题。代码错了。现在它只是没有收到任何东西。
  • 您的应用程序与您的应用程序的其他实例之间有什么关系?是同一个主机吗?同一交换机、路由器、LAN 上的主机?它可能是网络配置的事情,而不是代码的事情。我将通过 wireshark 验证数据包是否在应用程序的两个主机上的端口 667 上通过网络进出。广播不会在冲突域之外转发。
  • 您可能会发现这很有用:stackoverflow.com/q/687868/56778。除此之外,我不知道。
  • @glace 我在同一台机器上试了试,所以中间什么都没有,而且从 Mac 到同一 WLAN 上的笔记本。

标签: c# networking mono udp


【解决方案1】:

这应该可以解决问题:

static void Receiver( )
{
    Console.WriteLine( "Receiving..." );
    var udpClient = new UdpClient( 667 );
    var endPoint = new IPEndPoint( IPAddress.Any, 0 );
    byte[] data = udpClient.Receive( ref endPoint );
    Console.WriteLine( "Received '{0}'.", Encoding.UTF8.GetString( data ) );
    udpClient.Close( );
}

在 UdpClient 构造函数中提供端口号,而不是在 Receive( ) 方法中。接收的端点似乎用作输出参数,而不是输入参数。

【讨论】:

  • 是的,构造函数指定要使用的本地端口(默认为某个随机可用端口),Receive 的参数指定远程端点。
  • @kaitsu 解决了!并且不需要设置 EnableBroadcast = true。不知道是干什么用的。
【解决方案2】:

我看到了两个可能的问题:

  1. 您必须将UdpClient.EnableBroadcast 设置为true。请参阅msdn
  2. 1024 以下的端口是特权的,您可能需要额外的权限。使用 1024 以上的端口进行测试。

如果仍然无法正常工作,请使用网络嗅探器(例如,wireshark)来分析流量。

【讨论】:

  • 另外第三个问题是使用 IPAddress.Broadcast ,它是 255.255.255.255 几乎总是无法正常工作,因为软件和硬件会丢弃如此广泛的广播 - 尝试广播到更具体的子网,例如192.255.255.255
  • @MarkMennell 查看我修改后的问题。似乎没有任何帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多