【问题标题】:Listen To Specific Port With UDPClient & Get Transmitted Packets使用 UDP 客户端侦听特定端口并获取传输的数据包
【发布时间】:2017-02-18 15:52:33
【问题描述】:

首先,对于术语的错误使用,我深表歉意。

我的本​​地网络上有一个传感器。它通过端口 35333 向网络上的每个人广播当前温度值。我想创建一个 C# 控制台程序,不断接收来自该传感器的数据包。

这是我当前的代码:

public static UdpClient Client = new UdpClient(35333); 

private static async void Start()
{
      Client.BeginReceive(new AsyncCallback(recv), null);
}

private static void recv(IAsyncResult res)
{
      IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
      byte[] received = Client.EndReceive(res, ref RemoteIpEndPoint);

       //Process codes

      Client.BeginReceive(new AsyncCallback(recv), null);
}

上面的代码有效,但问题是:我一直收到相同的字节数组。

 ...
  [114][51][57][48][48][77][72][112]

  [114][51][57][48][48][77][72][112]

  [114][51][57][48][48][77][72][112]

  [114][51][57][48][48][77][72][112]

  [114][51][57][48][48][77][72][112]
 ...

据我所知,再次原谅我糟糕的网络知识,我必须以某种方式将确认发送回此传感器,以便它开始向我发送“真实”数据。

欢迎任何提示或建议!

【问题讨论】:

  • UDP 是无会话广播。由于单个设备可能有多个 UDP 数据包接收者,因此不太可能出现 ACK。您应该查看设备协议文档,并查看是否有可用的示例代码。

标签: c# network-programming udp udpclient


【解决方案1】:

这里至少有两种可能。

首先,这可能只是温度,并没有改变。在这种情况下,您需要按照传感器规范规定的方式解析字节。

其次,如果这确实是需要确认的数据包,那么您需要找出传感器侦听的端口(来自规范),以及确认数据包应该是什么样子(来自规范)并发送它到那个端口。

这里的关键是查看传感器随附的文档。 新代码将位于 recv 方法中,类似于以下内容:

private static void recv(IAsyncResult res) 
{ 
    IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
    byte[] received = Client.EndReceive(res, ref RemoteIpEndPoint);

    //Pseudo code
    //start_packet is the packet of bytes above from the sensor
    If (received == start_packet)
    {
        //send acknowledgement
    }

    //Process codes
    Client.BeginReceive(new AsyncCallback(recv), null); 
}

【讨论】:

    猜你喜欢
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2017-09-23
    • 2013-10-13
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多