展会信息港展会大全

C# Socket连接请求超时机制实现代码分享
来源:互联网   发布日期:2016-01-19 12:58:33   浏览:3819次  

导读:这篇文章主要介绍了C Socket连接请求超时机制实现,下面提供代码分享,大家可以参考使用 Net的System Net Sockets TcpClient和System Net Sockets Socket都没有直接为 Connect BeginConnect提供超时控制机制。 ...

这篇文章主要介绍了C# Socket连接请求超时机制实现,下面提供代码分享,大家可以参考使用

.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 Socket 连接请求 超时机制

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港