套接字ReceiveTimeout

Swa*_*aur 7 c# sockets timeout

我指定ReceiveTimout为40毫秒.但是接收超时需要500ms以上.我正在使用秒表来计算时间戳.

代码如下所示.

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

try
{  
    TCPSocket.Receive(Buffer);  

}  catch(SocketException e)  {  }
Run Code Online (Sandbox Code Playgroud)

use*_*819 8

您可以在任何超时期间同步轮询套接字.如果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
}
Run Code Online (Sandbox Code Playgroud)

我建议您阅读Stevens的UNIX网络编程第6章和第16章,以获得有关非阻塞套接字使用情况的更深入信息.尽管本书的名称中包含UNIX,但整体套接字体系结构在UNIX和Windows(和.net)中基本相同.


小智 0

我找到了这个:

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."); 
} 
Run Code Online (Sandbox Code Playgroud)