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连接请求的超时设置的更多相关文章

  1. C# Socket连接请求超时机制

    作者:RazanPaul 译者:Todd Wei 原文:http://www.codeproject.com/KB/IP/TimeOutSocket.aspx 介绍 您可能注意到了,.Net的Syst ...

  2. springboot 连接池wait_timeout超时设置

    使用springboot 线程池连接MySQL时,mysql数据库wait_timeout 为8个小时,所以程序第二天发现报错,在url配置了 autoReconnect=true 也不行,查询配置以 ...

  3. jquery ajax请求数据超时设置

    var ajaxTimeoutTest = $.ajax({ url:'', //请求的URL timeout : 1000, //超时时间设置,单位毫秒 type : 'get', //请求方式,g ...

  4. 【c#】设置Socket连接、接收超时(转)

    用到Socket,发现如果连接错误,比如Connect的端口不对,会造成很长时间的延时,程序就僵在那里,效果很不好: 在网上找到很方便的设置办法,分享如下: Socket.SetSocketOptio ...

  5. 【c#】设置Socket连接、接收超时

    用到Socket,发现如果连接错误,比如Connect的端口不对,会造成很长时间的延时,程序就僵在那里,效果很不好: 在网上找到很方便的设置办法,分享如下: Socket.SetSocketOptio ...

  6. go http.Get请求 http.Post请求 http.PostForm请求 Client 超时设置

    http中有Get/Post/PostForm方法 也可以通过http包中设置client 请求配置 ,然后通过client.Do方法实现请求 下demo中功能都实现,其中有详细说明: package ...

  7. jquery-ajax请求:超时设置,增加 loading 提升体验

    前端发送Ajax请求到服务器,服务器返回数据这一过程,因原因不同耗时长短也有差别,且这段时间内页面显示空白.如何优化这段时间内的交互体验,以及长时间内服务器仍未返回数据这一问题,是我们开发中不容忽视的 ...

  8. C# Socket.Connect连接请求超时机制

    介绍 您可能注意到了,.Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都没有直接为Connect/BeginConnect提供超时 ...

  9. 使用select io复用实现超时设置

    在linux的socket编程中,经常会遇到超时设置的问题,例如请求方如果在Ks内不发送数据则服务器要断开连接停止服务.这里我使用select的io复用实现超时5s设置,具体代码片段如下: fd_se ...

  10. 连接数据库超时设置autoReconnect=true

    1,问题现象: com.mysql.jdbc.CommunicationsException: The last packet successfully received from the serve ...

随机推荐

  1. MFC程序运行原理初探

    几年前,写过一段时间的MFC,但是只知其然不知其所以然,最近闲来无事,研究了一下MFC程序的运行顺序,特此记录一下. 首先,如果我们创建一个MFC程序的话,首先会自动生成一个CWinApp的子类,程序 ...

  2. SQL Server性能优化

    源代码文件 1,什么是性能问题? 现有资源没有达到最大吞吐量的前提下,系统不能满足合理的预期表现,则可以定义为有性能问题.性能指标包括:响应时间,吞吐量,可扩展性. 2,初探优化 2.1优化论 一般遇 ...

  3. 【C++复习】5.7 多文件结构与编译预处理命令

    1.C++项目结构 C++程序的一般组织架构 类声明文件(.h文件) 类实现文件(.cpp文件) 类的使用文件(main()所在的.cpp文件) 用工程组合各文件 2.编译链接 编译链接过程 3.外部 ...

  4. WCF部署HTTP错误404.3

    错误:WCF部署HTTP错误404.3-Not Found 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加MIME映射. 解决步骤如下: 控制面板-& ...

  5. js两个数组对象中,获取不相同的值 非交集元素对象

    查看前端面试题小程序 大量面试题和答案,请微信查看 var array1 = [ {"Num": "A " },{"Num": " ...

  6. 遍历List<Map<String,Object>>集合

    import java.util.*; public class HelloWorld { public static void main(String []args) { //定义一个List< ...

  7. openwrt从gitee pull代码并编译go项目

    安装ssh opkg update # openssh-keygen 可以用来生产密钥 opkg install openssh-keygen # 连接其他服务器 opkg install opens ...

  8. c#在代码中再次调用按钮点击事件

    在一个按钮事件中调用另一个按钮(button1)的点击事件,可以直接如下: button1.PerformClick() 也称之为 以编程方式调用按钮的click事件

  9. 如何在 Linux 上扫描/检测新的 LUN 和 SCSI 磁盘

    当 Linux 系统连接到 SAN(存储区域网络)后,你需要重新扫描 iSCSI 服务以发现新的 LUN. 要做到这一点,你必须向存储团队提供 Linux 主机的 WWN 号和所需的 LUN 大小. ...

  10. 实验:利用mqtt-spring-boot-starter实现后台云服务数据采集和远程控制

    1.资源地址及使用说明 https://search.maven.org/artifact/com.github.tocrhz/mqtt-spring-boot-starter/1.2.7/jar 2 ...