您的位置:首页 > 编程语言 > C#

C#中设置Socket连接请求的超时

2012-04-06 09:31 477 查看
C#中, 对于Socket的请求,无论是同步还是异步,都没有提供超时机制,SendTimeout,ReceiveTimeout均无用..

对于需要测试网络是否正常连接的情况下,,超时控制很是有用,  如果服务器不存在,或是客户机网络异常,, 在没有设置超时的情况下,,Socket请求

需要等很久...

于是找呀找,,终于在网上找到解决的办法,  代码如下...

private readonly ManualResetEvent TimeoutObject = new ManualResetEvent(false);
/// <summary>
/// Socket连接请求
/// </summary>
///<param name="remoteEndPoint">网络端点</param>
///<param name="timeoutMSec">超时时间</param>
public void Connect(IPEndPoint remoteEndPoint, int timeoutMSec)
{
TimeoutObject.Reset();
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.BeginConnect(remoteEndPoint, CallBackMethod, socket);
//阻塞当前线程
if (TimeoutObject.WaitOne(timeoutMSec, false))
{
//MessageBox.Show("网络正常");
}
else
{
//MessageBox.Show("连接超时");
}
}
//--异步回调方法
private void CallBackMethod(IAsyncResult asyncresult)
{
//使阻塞的线程继续
TimeoutObject.Set();
}



 

代码虽然简单,不过其思路还是不错的,大概说一下其原理:

重点就是TimeoutObject.WaitOne与Socket的BeginConnect异步请求的回调函数CallBackMethod.!

首先利用TimeoutObject.WaitOne阻塞当前线程,并设置等待时间,,如果在等待的时间内仍然无信号,则判断为连接超时,

在网络正常连接的情况下,通过Socket的BeginConnect异步请求,服务器正常回应,则会调用CallBackMethod回调函数,关键就在这里了,我们在CallBackMethod函数中,给予TimeoutObject信号,TimeoutObject在指定时间timeoutMSec内收到信号,WaitOne返回True,则认为网络连接正常..

如果网络异常,,CallBackMethod函数得不到调用,TimeoutObject则一直处于等待状态,超过指定的时间.,WaitOne不再继续等待,直接返回False,则认为网络连接超时..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: