2011-07-14 110 views
2

我正试图在局域网上测试UDP通信。我有一小段代码,我试图在两台电脑上运行它(一个应该等待接收,另一个应该发送)。奇怪的是,计算机A发送和B正确接收,但如果我尝试A接收和B发送它不起作用。你知道为什么会这样吗?在.NET中发送和接收UDP数据包

public void SendBroadcast(int port, string message) 
    { 
     UdpClient client = new UdpClient(); 
     byte[] packet = Encoding.ASCII.GetBytes(message); 

     try 
     { 
      client.Send(packet, packet.Length, IPAddress.Broadcast.ToString(), port); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

public void Receive(int port) 
    { 
     UdpClient client = null; 

     try 
     { 
      client = new UdpClient(port); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

     IPEndPoint server = new IPEndPoint(IPAddress.Any, 0); 


     while (true) 
     { 
      try 
      { 
       byte[] packet = client.Receive(ref server); 
       Console.WriteLine("{0}, {1}", server, Encoding.ASCII.GetString(packet)); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
     } 
    } 

而且电话:

SendBroadcast(444, "hello"); Receive(444); 

如果我能够正常工作而造成每次通话3个封装在同一台计算机上运行的程序的两个实例。

在此先感谢。

+0

是否明确指定IP地址并且不依赖广播使这项工作在两个方向上都可行? – Tremmors

回答

1

好吧,如果相同的代码在一个而不是另一个上工作,那就是你的环境。检查您的防火墙设置,确保它不阻止发送方的广播或防止接收方收到。 Wireshark(甚至Windows的netmon)在这里应该会有所帮助。

+0

是的,这是问题...谢谢! – Reixons

2

尝试使用异步方法,以便您可以在不阻止发送消息的情况下持续监听消息。

+0

你能否详细说明一下异步方法。任何可用的链接?谢谢 – WEFX

+0

[这是MSDN文档的链接](http://msdn.microsoft.com/en-us/library/9wkb9k12.aspx)。查找以“开始”和“结束”开头的方法。这里有很多例子可以找到。 – Jay

0

这两个系统之间有什么网络设备?

这两个系统在同一个子网上有相同的子网掩码吗?

IPV4网络有一个有趣的事情;你可以有多个broadcast addresses。您可以广播到本地网络或本地子网。这些是明显不同的地址,如果一个系统的IP设置不同,它可能没有意识到它应该监听这个本地子网广播。

事情尝试:

  1. 确保IPv6是两端禁用(IPV6不支持广播地址,但让刚刚建立一个基准)。
  2. 显式设置程序中的IP地址,它工作吗?我的猜测是肯定的,所以我们必须确定原因。
  3. 加载wireshark并嗅探数据包。看看他们是否一直到远程主机,而他只是无视它们。
-1

当试图异步执行此操作时,Microsoft会忽略告诉用户创建自己的部分类,如下所示。非常简单,但没有这个,可能很难通读他们的例子。

private partial class UdpState 
{ 
    public UdpClient u; 
    public IPEndPoint e; 
}