【问题标题】:Using C# UDP Client使用 C# UDP 客户端
【发布时间】:2012-01-19 15:50:04
【问题描述】:

我正在制作一个需要一直监听 UDP 数据的程序。

我目前的想法是让这个方法在一个线程中持续运行,侦听数据包,然后将它们添加到一个列表中,准备在其他线程中处理。主要问题是我还想将接收到的 IP 添加到列表中,以便其他线程可以处理它,但我不知道程序是否会暂时停止使用 Receive 方法,如果它在处理时会丢失接收到的数据包数据,或者它是否仍然可以从队列中获取它们。

public void listen()
{
    try
    {
        packetQueue.Add(receivingUdpClient.Receive(ref RemoteIpEndPoint)); 
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }
}

【问题讨论】:

    标签: c# .net networking udp packet-capture


    【解决方案1】:

    网络流量应该在您的网卡上缓冲,因此即使您的收听不一致,数据也应该是一致的。至于IP,您可以从端点获取它,因此您也需要传递它:

    public void listen()
      {
          try
          {
              packetQueue.Add(receivingUdpClient.Receive(ref RemoteIpEndPoint), RemoteIpEndPoint);
           }
          catch (Exception e)
          {
              Console.WriteLine(e.ToString());
          }
      }
    

    如果您想在接收之间尽可能少地错过时间,我建议您使用 BeginReceive 并在回调中启动一个新的 BeginReceive,然后再在回调中处理接收到的数据。不过,这会增加一些同步复杂性。

    【讨论】:

    • 最后一部分是个好主意,我想我会这样做的,谢谢
    【解决方案2】:

    我不知道如何从 Udp 数据包中获取 IP。您需要从 EndPoint 获取它:

     byte[] receivedBytes = oClientListener.Receive(ref endPoint);
     IPAddress = endPoint.Address;
     PackQueue.Add( new PacketOfSomeType( receivedBytes, IPAdress ) );
    

    此外,您的程序需要非常缓慢地运行才能开始丢失任何数据包 - 只要您设置了客户端侦听器,Windows 就会为您缓冲这些数据包!

    【讨论】:

    • 你确定这只是 Windows 缓冲它吗?我以为网卡缓冲
    • 啊,是的,我重新阅读了您的问题并编辑了我的答案。不,只要 UdpClient 处于活动状态,您的流量就会被缓冲。
    • 我不会淡化性能方面的问题。由于缺乏连接,UDP 数据包可能会以快速而激烈的方式进入(想想 SQL Slammer)。只是保持实物。
    • @mtijn:是的,操作系统有一个网络缓冲区,我很确定。现在,操作系统中保存了多少,卡上保存了多少,我不确定。
    • @AndrewBarber:我想这个想法只是处理时间不会超过数据包之间的预期平均时间。
    猜你喜欢
    • 2013-04-21
    • 2011-09-30
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2016-02-16
    相关资源
    最近更新 更多