2012-05-28 14 views
6

Según la documentación de MSDN, no es posible configurar Socket.SendTimeout a un valor inferior a 500ms: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendtimeout La misma regla es válida para Socket.ReceiveTimeout (incluso no mencionado en la documentación de MSDN, esto es cierto, ya que ambos casos fueron probados prácticamente).Configuración del tiempo de espera de envío/recepción del socket a menos de 500 ms en .NET

¿Hay alguna otra forma de descontar una operación de recepción de socket si, por ejemplo, tarda más de 10ms en completarse?

+0

¿Qué hay de malo en configurar 'Socket.ReceiveTimeout' en 10ms? – Reniuz

+0

Compruebe esto http://stackoverflow.com/questions/9327326/socket-receivetimeout – Ras

+0

Hice una prueba con Socket.ReceiveTimeout establecido en 10m. Todo falló después de aproximadamente 500 ms, por lo que supongo que aquí también se aplica la misma regla, aunque no se menciona en la documentación. – donatasm

Respuesta

8

La respuesta simple es "usted no".

Send() y Receive() llamadas bloquean el flujo del programa hasta que se envían datos, se reciben o se produce un error.

Si desea tener más control sobre sus llamadas, existen varios mecanismos disponibles. El más simple es usar Poll().

Socket s; 
// ... 
// Poll the socket for reception with a 10 ms timeout. 
if (s.Poll(10000, SelectMode.SelectRead)) 
{ 
    s.Receive(); // This call will not block 
} 
else 
{ 
    // Timed out 
} 

También puede utilizar Select(), BeginReceive() o ReceiveAsync() para otros tipos de comportamientos.

Le recomiendo que lea los capítulos 6 y 16 de la programación en red UNIX de Stevens para obtener más información detallada sobre el uso del zócalo sin bloqueo. Aunque el libro tiene UNIX en su nombre, la arquitectura global de los sockets es esencialmente la misma en UNIX y Windows (y .net)

+1

Muchas gracias por la respuesta y por la referencia. Eso era lo que necesitaba. – donatasm

Cuestiones relacionadas