2011-03-29 93 views
1

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

Byte[] receiveBytes = new Byte[4096]; 

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

多少数据你送?你发送的速率是多少? – Jeff 2011-03-29 05:50:28

回答

3

Receive method将只读取一次一个报包。如果您想要读取多个数据报,您需要多次拨打Receive

0

如果你想接收多个数据包,你应该考虑使用异步方法来接收它们。 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); 
    } 
}