c# timeout udpclient

¿Puedo establecer el tiempo de espera para UdpClient en C#?



timeout (5)

Me pregunto si puedo establecer un valor de tiempo de espera para el método de recepción de UdpClient.

Quiero usar el modo de bloqueo, pero como a veces udp pierde el paquete, mi programa udpClient.receive quedará ahí para siempre.

¿Alguna buena idea de cómo puedo manejar eso?


En realidad, parece que UdpClient está roto cuando se trata de tiempos de espera. Intenté escribir un servidor con un subproceso que contenía solo un Receive que obtuvo los datos y los agregué a una cola. He hecho este tipo de cosas durante años con TCP. La expectativa es que el bucle se bloquee en la recepción hasta que llegue un mensaje de un solicitante. Sin embargo, a pesar de configurar el tiempo de espera al infinito:

_server.Client.ReceiveTimeout = 0; //block waiting for connections _server.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 0);

el socket se agota después de unos 3 minutos.

La única solución que encontré fue detectar la excepción de tiempo de espera y continuar el ciclo. Esto oculta el error de Microsoft pero no responde a la pregunta fundamental de por qué sucede esto.


Hay una propiedad SendTimeout y ReceiveTimeout que puede usar en el Socket del UdpClient .

Aquí hay un ejemplo de un tiempo de espera de 5 segundos:

var udpClient = new UdpClient(); udpClient.Client.SendTimeout = 5000; udpClient.Client.ReceiveTimeout = 5000; ...


Hay una propiedad ReceiveTimeout que puedes usar.


puedes hacer así:

udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 5000);


A lo que se refiere Filip está anidado dentro del socket que contiene UdpClient.Client.ReceiveTimeout ( UdpClient.Client.ReceiveTimeout ).

También puede usar los métodos asíncronos para hacer esto, pero bloquear manualmente la ejecución:

var timeToWait = TimeSpan.FromSeconds(10); var udpClient = new UdpClient( portNumber ); var asyncResult = udpClient.BeginReceive( null, null ); asyncResult.AsyncWaitHandle.WaitOne( timeToWait ); if (asyncResult.IsCompleted) { try { IPEndPoint remoteEP = null; byte[] receivedData = udpClient.EndReceive( asyncResult, ref remoteEP ); // EndReceive worked and we have received data and remote endpoint } catch (Exception ex) { // EndReceive failed and we ended up here } } else { // The operation wasn''t completed before the timeout and we''re off the hook }