【问题标题】:UDPClient only receives one datagramUDPClient 只接收一个数据报
【发布时间】:2013-12-22 21:13:41
【问题描述】:

我正在尝试读取连续的 UDP 字节(或一次至少超过 1 个)。我的缓冲区是单个数据报/数据包(1000 字节)大小的 4 倍。

 Byte[] receiveBytes = new Byte[4096];

 UdpClient udpClient = new UdpClient(56885);
 IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
 Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);

【问题讨论】:

  • 您要发送多少数据?您发送的速度是多少?

标签: c# udp


【解决方案1】:

Receive method 一次只能读取一个 数据报包。如果要读取多个数据报,需要多次调用Receive

【讨论】:

    【解决方案2】:

    如果你想接收多个数据包,你应该考虑使用异步方法来接收它们。 UdpClient 类有一个异步习惯用法,您可以给它一个回调函数并继续执行其他处理(例如更新 UI)。

    Here is an example from the source:

    public static bool messageReceived = false;
    
    public static void ReceiveCallback(IAsyncResult ar)
    {
      UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
      IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e;
    
      Byte[] receiveBytes = u.EndReceive(ar, ref e);
      string receiveString = Encoding.ASCII.GetString(receiveBytes);
    
      Console.WriteLine("Received: {0}", receiveString);
      messageReceived = true;
    }
    
    public static void ReceiveMessages()
    {
      // Receive a message and write it to the console.
      IPEndPoint e = new IPEndPoint(IPAddress.Any, listenPort);
      UdpClient u = new UdpClient(e);
    
      UdpState s = new UdpState();
      s.e = e;
      s.u = u;
    
      Console.WriteLine("listening for messages");
      u.BeginReceive(new AsyncCallback(ReceiveCallback), s);
    
      // Do some work while we wait for a message. For this example, 
      // we'll just sleep 
      while (!messageReceived)
      {
        Thread.Sleep(100);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 2017-05-10
      相关资源
      最近更新 更多