2013-10-02 44 views
1

我正在尝试发送广播以联系我的应用程序的其他实例。我在Mac上的Mono 3 Console程序中运行下面的代码(但也尝试在Windows上使用VS2012)。但是,该消息从未收到。接收器只是坐在那里,并阻止在呼叫UDP广播从未收到 - 代码有什么问题?

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(); 
     } 
    } 
} 
+0

它挂在那个构造函数调用?或者程序崩溃了?你是否将调用包装在'try/catch'中以查看它是否抛出异常? –

+0

@JimMischel我修改了这个问题。代码错了。现在它只是没有收到任何东西。 – Krumelur

+0

你的应用程序和你的应用程序的其他实例之间有什么?它是同一个主机吗?主机在同一个交换机,路由器,局域网?它可能是一个网络配置的东西,而不是代码的东西。我会通过wireshark验证数据包是在您的应用程序的两台主机上通过端口667上的线路传输的。广播不会在冲突域之外转发。 –

回答

3

这应该做的伎俩:

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构造的端口号,而不是。接收端点似乎被用作out参数,而不是输入参数。

+0

是的,构造函数指定要使用的本地端口(默认为一些随机可用端口),“Receive”参数指定远程端点。 – Jester

+0

@kaitsu解决了它!并且不需要设置EnabledBroadcast = true。我不知道那是什么用的。 – Krumelur

1

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

  1. 你必须设置UdpClient.EnableBroadcasttrue。请参阅msdn
  2. 1024以下的端口有特权,您可能需要额外的权利。使用1024以上的端口进行测试。

如果仍然不起作用,则使用网络嗅探器(例如wireshark)来分析流量。

+0

第三个问题是使用IPAddress.Broadcast(255.255.255.255)几乎永远不会工作,因为软件和硬件会丢弃如此广泛的广播 - 尝试广播到更具体的子网,例如192.255.255.255 – markmnl

+0

@MarkMennell看到我修改后的问题。似乎没有任何帮助。 – Krumelur

+0

@Jester不起作用。看到我修改后的问题。 – Krumelur