C#中Socket连接请求的超时设置
2021/9/22 9:10:53
本文主要是介绍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 }
代码大概原理如下:
重点就是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连接请求的超时设置的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#