2016-09-21 104 views
0

我想在c#程序中接收udp包。几个软件包组合的内容是一个XML状态日志。在一个状态记录完成后重复。见下图。我使用this UDP Broadcast example来获取包,端口53181(见图片)。 但该程序没有收到任何东西。有任何想法吗?我如何使用收到的包来获取XML数据?c#接收带有xml内容的udp广播包(windows 7)

Wireshark Screen

+0

我的答案解决了你的问题吗?如果是这样,请将其标记为答案。如果不。详细说明你需要什么。 –

+0

对不起,但我没有时间测试你的代码。谢谢btw。我希望我能在下周进行测试。 – jazz

+0

恩,我对c#编程相当陌生。使用界面的原因是什么?是否可以通过将命令行打印接收数据的方式完成示例?这将帮助我了解如何处理您的代码。谢谢 – jazz

回答

0

这是一个通用接收器I类制成

public class UdpBroadcastReceiver 
{ 
    private IBroadcastInterpreter _interpreter; 
    private volatile bool _shouldReceive = true; 

    /// <summary> 
    /// Will listen on all ports for udp broadcasts - Will handle input with interpreter 
    /// </summary> 
    /// <param name="interpreter"></param> 
    public UdpBroadcastReceiver(IBroadcastInterpreter interpreter) 
    { 
     _interpreter = interpreter; 
    } 

    /// <summary> 
    /// Will listen for a broadcast indefinetly. Will lock up your program. 
    /// Use Task.Run to start listening. Then you can use StopListening to break the loop. 
    /// </summary> 
    public void ListenForBroadcast(int port) 
    { 
     using (UdpClient client = new UdpClient(port)) 
     { 
      IPEndPoint senderEndPoint = new IPEndPoint(IPAddress.Any, 0); 
      while (_shouldReceive) 
      { 
       byte[] receiveBuffer = client.Receive(ref senderEndPoint); // execution will stop and wait for data. 
       _interpreter?.HandleBroadcast(receiveBuffer); 
      } 
     } 
    } 

    /// <summary> 
    /// Breaks the while loop in ListenForBroadcast 
    /// </summary> 
    public void StopListening() 
    { 
     _shouldReceive = false; 
    } 
} 

public interface IBroadcastInterpreter 
{ 
    void HandleBroadcast(byte[] input); 
} 

的示例实现可以是接口:

class WriteToConsole : IBroadcastInterpreter 
{ 
    public void HandleBroadcast(byte[] input) 
    { 
     string text = Encoding.ASCII.GetString(input); 
     Console.WriteLine(text); 
    } 
} 

这是我制作的UDP广播器,用于播出时间。

class UdpBroadcaster 
{ 

    private int _port; 
    private bool shouldRun = true; 

    public UdpBroadcaster(int port) 
    { 
     _port = port; 
    } 

    public void Stop() 
    { 
     shouldRun = false; 
    } 

    public void Start() 
    { 
     Trace.TraceInformation("Entered start method"); 
     Task.Run(() => 
       { 
        Trace.TraceInformation("Started task"); 
        IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Broadcast, _port); 

        using (UdpClient client = new UdpClient()) 
        { 
         Trace.TraceInformation("Entered using statement"); 
         client.EnableBroadcast = true; 
         while(shouldRun) 
         { 
          Trace.TraceInformation("Started while loop"); 
          byte[] data = Encoding.ASCII.GetBytes(DateTime.Now.ToString(new CultureInfo("da-dk"))); 
          client.Send(data, data.Length, serverEndPoint); 
          Trace.TraceInformation("waiting 5 seconds"); 
          Thread.Sleep(5 * 1000); 
         } 
        } 
       }); 
    } 

} 

创建一个WriteToConsole类的实例,并将其传递到广播接收器的构造函数中。然后,无论何时收到广播,它都将使用接口的实现来执行操作。在这种情况下,根据您的请求 - 它只会写入控制台。