Я использую класс System.Net.Sockets
Socket
для получения дейтаграмм UDP.
Я хотел знать точную длину полученной дейтаграммы, чтобы проверить ее достоверность. В документации метода
Socket.Receive (Byte ())
говорится:
Если вы используете Socket без установления соединения, Receive будет читать первую дейтаграмму в очереди с адреса назначения, указанного в методе Connect. Если полученная датаграмма превышает размер параметра буфера, буфер заполняется первой частью сообщения, лишние данные теряются и генерируется SocketException.
Свойство Socket.Available
дает общее количество байтов, доступных для чтения. Суммирует размер всех датаграмм в очереди.
Есть ли способ узнать размер следующей датаграммы?
public static void Receive()
{
Byte[] buf, discardbuf;
const int paklen = 32; //correct packet length
int l;
buf = new Byte[paklen];
discardbuf = new Byte[4096];
while (rcv_enable)
{
l = soc.Available;
if (l == 0) continue;
if (l == paklen) soc.Receive(buf); //receive the correct packet
else soc.Receive(discardbuf); //discard otherwise
Thread.Sleep(200);
Console.WriteLine("Received {0}", l);
};
}