UDPClient получает только одну дейтаграмму - PullRequest
1 голос
/ 29 марта 2011

Я пытаюсь прочитать непрерывные байты UDP (или, по крайней мере, более 1 за один раз).Мой буфер в 4 раза больше одного дейтаграммы / пакета (1000 байт).

 Byte[] receiveBytes = new Byte[4096];

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

Ответы [ 2 ]

3 голосов
/ 29 марта 2011

Метод Receive будет считывать только один пакет дейтаграмм за раз. Если вы хотите прочитать несколько дейтаграмм, вам нужно несколько раз вызвать Receive.

0 голосов
/ 22 декабря 2013

Если вы хотите получать несколько пакетов, вам следует рассмотреть возможность использования асинхронного метода для их получения. Класс UdpClient имеет асинхронную идиому, в которой вы предоставляете ему функцию обратного вызова и переходите к другой обработке (например, обновлению пользовательского интерфейса).

Вот пример из источника:

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);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...