Socket ReceiveTimeout - PullRequest
       4

Socket ReceiveTimeout

7 голосов
/ 17 февраля 2012

Я указал ReceiveTimout как 40 мс. Но на получение тайм-аута уходит более 500 мс. Я использую секундомер для вычисления полученного времени.

Код показан ниже.

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

try
{  
    TCPSocket.Receive(Buffer);  

}  catch(SocketException e)  {  }

Ответы [ 3 ]

8 голосов
/ 30 мая 2012

Вы можете синхронно опрашивать сокет с любым временем ожидания.Если Poll() возвращает true, вы можете быть уверены, что можете позвонить на Receive(), который не будет блокироваться.

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
}

Я рекомендую прочитать главы 6 Стивенса «Сетевое программирование UNIX» и16 для более подробной информации об использовании неблокирующих сокетов.Несмотря на то, что в названии книги написано UNIX, общая архитектура сокетов практически одинакова в UNIX и Windows (и .net)

2 голосов
/ 14 сентября 2014

Вы не можете использовать значения тайм-аута, которые меньше 500 мс. Смотрите здесь для SendTimeout: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendtimeout

Несмотря на то, что MSDN не устанавливает того же требования для ReceiveTimeout, мой опыт показывает, что это ограничение все еще существует.

Вы также можете прочитать об этом в нескольких сообщениях SO:

0 голосов
/ 17 февраля 2012

Я нашел это:

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