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

发布时间:2022-07-05 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了C#中Socket连接请求的超时设置脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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

<转载>

C#中, 对于Socket的请求,无论是同步还是异步,都没有提供超时机制,SendTimeout,ReceiveTimeout均无用..

对于需要测试网络是否正常连接的情况下,超时控制很是有用, 如果服务器不存在,或是客户机网络异常,, 在没有设置超时的情况下,,Socket请求需要等40s-70s...终于在网上找到解决的办法。

 1 PRivate readonly ManualResetEvent TimeoutObject = new ManualResetEvent(false);
 2 
 3 /// <summary> 
 4 /// Socket连接请求 
 5 /// </summary> 
 6 ///<param name="remoteEndPoint">网络端点</param> 
 7 ///<param name="timeoutMSec">超时时间</param> 
 8 public void Connect(IPEndPoint remoteEndPoint, int timeoutMSec)
 9 {
10 TimeoutObject.Reset();
11 VAR socket = new Socket(AddressFamily.internetwork, SocketType.Stream, ProtocolType.Tcp);
12 socket.BeginConnect(remoteEndPoint, CallBackMethod, socket);
13 //阻塞当前线程 
14 if (TimeoutObject.WaitOne(timeoutMSec, false))
15 { 
16 //MessageBox.Show("网络正常");
17 }
18 else
19 { 
20 //MessageBox.Show("连接超时");
21 }
22 }
23 //--异步回调方法 
24 private void CallBackMethod(IAsyncResult asyncresult)
25 {
26 //使阻塞的线程继续 
27 TimeoutObject.Set();
28 }

&nbsp;

代码大概原理如下:

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

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

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

如果网络异常,CallBackMethod函数得不到调用,TimeoutObject则一直处于等待状态,超过指定的时间.,WaitOne不再继续等待,直接返回False,则认为网络连接超时..————————————————版权声明:本文为CSDN博主「Igor Sun」的原创文章,遵循CC 4.0 BY-sA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/deflypig/article/details/90756768

脚本宝典总结

以上是脚本宝典为你收集整理的C#中Socket连接请求的超时设置全部内容,希望文章能够帮你解决C#中Socket连接请求的超时设置所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。