2012-02-17 8 views
6

He especificado el ReceiveTimout como 40 ms. Pero se necesita más de 500ms para que el tiempo de espera de recepción exceda. Estoy usando un cronómetro para calcular el timetaken.Socket ReceiveTimeout

El código se muestra a continuación.

Socket TCPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, 
           ProtocolType.Tcp); 
TCPSocket.ReceiveTimeout = 40; 

try 
{ 
    TCPSocket.Receive(Buffer); 

} catch(SocketException e) { } 
+1

Sírvanse proporcionar algo más de código. – rekire

Respuesta

0

me encontré éste:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

IAsyncResult result = socket.BeginConnect(sIP, iPort, null, null); 

bool success = result.AsyncWaitHandle.WaitOne(40, true); 

if (!success) 
{   

      socket.Close(); 
      throw new ApplicationException("Failed to connect server."); 
} 
+0

Requiero que Receive sea síncrono, no asíncrono. Además, no quiero que el socket se cierre si el tiempo de espera de recepción se agota. –

7

puede sondear de forma sincrónica en el zócalo con cualquier tiempo de espera que desea. Si Poll() devuelve true, puede estar seguro de que puede hacer una llamada al Receive() que no se bloqueará.

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 
} 

le recomiendo que lea red UNIX Stevens' Programación de los capítulos 6 y 16 para obtener más información en profundidad sobre la no bloqueante uso del socket. Aunque el libro tiene UNIX en su nombre, la arquitectura general de los sockets es esencialmente la misma en UNIX y Windows (y .net)

2

No puede usar valores de tiempo de espera que sean menores que 500ms. ver aquí para SendTimeout: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendtimeout

A pesar de MSDN no establece el mismo requisito para la ReceiveTimeout, mi experiencia demuestra que esta restricción está todavía allí.

También puede leer más sobre esto en varios SO mensajes: