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

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

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

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

需要等很久...

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

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

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值