C# Socket连接请求超时机制实现代码分享
C# Socket连接请求超时机制实现代码分享
发布时间:2016-12-28 来源:查字典编辑
摘要:.Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都没有直接为Conne...

.Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都没有直接为Connect/BeginConnect提供超时控制机制。因此,当服务器未处于监听状态,或者发生网络故障时,客户端连接请求会被迫等待很长一段时间,直到抛出异常。默认的等待时间长达20~30s。.Net Socket库的SocketOptionName.SendTimeout提供了控制发送数据的超时时间,但并非本文讨论的连接请求的超时时间。

实现

下面是实现的关键代码:

复制代码 代码如下:

class TimeOutSocket

{

private static bool IsConnectionSuccessful = false;

private static Exception socketexception;

private static ManualResetEvent TimeoutObject = new ManualResetEvent(false);

public static TcpClient TryConnect(IPEndPoint remoteEndPoint, int timeoutMiliSecond)

{

TimeoutObject.Reset();

socketexception = null;

string serverip = Convert.ToString(remoteEndPoint.Address);

int serverport = remoteEndPoint.Port;

TcpClient tcpclient = new TcpClient();

tcpclient.BeginConnect(serverip, serverport,

new AsyncCallback(CallBackMethod), tcpclient);

if (TimeoutObject.WaitOne(timeoutMiliSecond, false))

{

if (IsConnectionSuccessful)

{

return tcpclient;

}

else

{

throw socketexception;

}

}

else

{

tcpclient.Close();

throw new TimeoutException("TimeOut Exception");

}

}

private static void CallBackMethod(IAsyncResult asyncresult)

{

try

{

IsConnectionSuccessful = false;

TcpClient tcpclient = asyncresult.AsyncState as TcpClient;

if (tcpclient.Client != null)

{

tcpclient.EndConnect(asyncresult);

IsConnectionSuccessful = true;

}

}

catch (Exception ex)

{

IsConnectionSuccessful = false;

socketexception = ex;

}

finally

{

TimeoutObject.Set();

}

}

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新C#教程学习
热门C#教程学习
编程开发子分类