一、什么是Keep-Alive模式?

我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
http 1.0中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入"Connection: close ",才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。

二、代码使用

SetKeepAliveValues 方法启用或禁用 TCP 保持选项指定的 TCP 保持超时和间隔用于保持 TCP 数据包的每个连接设置。保持选项的详细信息,请参阅 4.2.3.6 节要求的互联网 HostsCommunication 图层在 IETF 网站上可用的 RFC 1122 中指定。

optionInValue 参数,传递给 Socket.IOControl 应指向 Mstcpip.h 头文件中定义的 tcp_keepalive 结构。这种结构的定义如下:

  1. /* Argument structure for SIO_KEEPALIVE_VALS */
  2. struct tcp_keepalive {
  3. u_long onoff;
  4. u_long keepalivetime;
  5. u_long keepaliveinterval;
  6. };

将 tcp_keepalive C 转换为 C# struct结构

  1. // Convert tcp_keepalive C struct To C# struct
  2. [
  3. System.Runtime.InteropServices.StructLayout
  4. (
  5. System.Runtime.InteropServices.LayoutKind.Explicit
  6. )
  7. ]
  8. unsafe struct TcpKeepAlive
  9. {
  10. [System.Runtime.InteropServices.FieldOffset()]
  11. [
  12. System.Runtime.InteropServices.MarshalAs
  13. (
  14. System.Runtime.InteropServices.UnmanagedType.ByValArray,
  15. SizeConst =
  16. )
  17. ]
  18. public fixed byte Bytes[];
  19.  
  20. [System.Runtime.InteropServices.FieldOffset()]
  21. public uint On_Off;
  22.  
  23. [System.Runtime.InteropServices.FieldOffset()]
  24. public uint KeepaLiveTime;
  25.  
  26. [System.Runtime.InteropServices.FieldOffset()]
  27. public uint KeepaLiveInterval;
  28. }
  29.  
  30. public int SetKeepAliveValues
  31. (
  32. System.Net.Sockets.Socket Socket,
  33. bool On_Off,
  34. uint KeepaLiveTime,
  35. uint KeepaLiveInterval
  36. )
  37. {
  38. int Result = -;
  39.  
  40. unsafe
  41. {
  42. TcpKeepAlive KeepAliveValues = new TcpKeepAlive();
  43.  
  44. KeepAliveValues.On_Off = Convert.ToUInt32(On_Off);
  45. KeepAliveValues.KeepaLiveTime = KeepaLiveTime;
  46. KeepAliveValues.KeepaLiveInterval = KeepaLiveInterval;
  47.  
  48. byte[] InValue = new byte[];
  49.  
  50. for (int I = ; I < ; I++)
  51. InValue[I] = KeepAliveValues.Bytes[I];
  52.  
  53. Result = Socket.IOControl(IOControlCode.KeepAliveValues, InValue, null);
  54. }
  55.  
  56. return Result;
  57. }

调用方法:

  1. System.Net.Sockets.Socket Socket = new System.Net.Sockets.Socket
  2. (
  3. System.Net.Sockets.AddressFamily.InterNetwork,
  4. System.Net.Sockets.SocketType.Stream,
  5. System.Net.Sockets.ProtocolType.Tcp
  6. );
  7.  
  8. // Set 10 Hours: 10 * 60 * 60 * 1000 = 36,000,000 every 1 Second 1000
  9. SetKeepAliveValues(Socket, true, , );

Set Keep-Alive Values---C到C#代码的转换的更多相关文章

  1. [RN] React Native代码转换成微信小程序代码的转换引擎工具

    React Native代码转换成微信小程序代码的转换引擎工具 https://github.com/areslabs/alita

  2. python轻松实现代码编码格式转换

    python轻松实现代码编码格式转换 最近刚换工作不久,没太多的时间去整理工作中的东西,大部分时间都在用来熟悉新公司的业务,熟悉他们的代码框架了,最主要的是还有很多新东西要学,我之前主要是做php后台 ...

  3. Rsa加解密Java、C#、php通用代码 密钥转换工具

    之前发了一篇"TripleDes的加解密Java.C#.php通用代码",后面又有项目用到了Rsa加解密,还是在不同系统之间进行交互,Rsa在不同语言的密钥格式不一样,所以过程中主 ...

  4. [实现]Javascript代码的另一种压缩与加密方法——代码图片转换

    代码=图片 图片=代码 JS代码对于喜欢F12的同志来说,连个遮羞布都没有... 虽然把代码变成图片也仅仅只是增加一层纱布而已...但这方法还是挺好玩的,而且代码也被压缩了一点. 第一次看到[图片=代 ...

  5. python——代码编码格式转换

    最近刚换工作不久,没太多的时间去整理工作中的东西,大部分时间都在用来熟悉新公司的业务,熟悉他们的代码框架了,最主要的是还有很多新东西要学,我之前主要是做php后台开发的,来这边之后还要把我半路出家的前 ...

  6. uml的图与代码的转换——类图

    Uml是我们经常使用的统一建模语言或称标准建模语言.它的图是如何和代码对应的呢?下面我们就来就这个问题讨论一下: 首先是类:uml中的类图是这样的 在这个图中,我们可以看出,这个类图总共分了三行,第一 ...

  7. [C#] - 从 HTML 代码中 转换 / 提取 可读文字(PlainText)的方法

    背景 在做网页数据分析的时候,我们关注的部分是内容,可以过滤掉HTML标签.Javascript.CSS等代码. 目标输入 <b>Hello World.</b><br/ ...

  8. C# 父类代码动态转换子类

    百度上搜索C# 如何父类运行时转换成子类,没有得到相应答案,突然想起C# 有dynamic类型试试看结果成功了... 以后编写代码类似这样的代码 就可以删减掉了 if (en.type == EMap ...

  9. [JS进阶] 编写可维护性代码 (1)

    今天的web应用大至成千上万行的javascript代码,执行各种复杂的过程,这种演化让我们开发者必须得对可维护性有一定的认识!编写可维护性代码很重要,很多情况下我们是以他人的工作成果为基础,确保代码 ...

随机推荐

  1. hibernate spring sturts2配置

    <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...

  2. Unity3d场景合并

    Unity3d场景合并 一.Unity3d场景合并,有一次的情况是这样的,就是我们是每个人都在开发,每个人有不同的场景,那么合并的时候,有些会出问题,那么我有一个好的方案,就是首先弄一个公共的资源库, ...

  3. BAT互联网公司是如何内部推荐的?

    中国十大互联网公司 注:以上按照目前市值排序整理出来,当然还有更多未上市的潜力股.如:美团.豆瓣.豌豆荚.美图秀秀等等 各大互联网公司招聘官网 阿里招聘:https://job.alibaba.com ...

  4. Qt之模型/视图(自定义按钮)(使用QStyleOption的子类进行drawControl,和我用的方法完全不一样)

    http://blog.csdn.net/liang19890820/article/details/50974059

  5. Maven实战二

    简述: 现需要 在Eclipse中配置Maven插件 安装maven应用,配置Maven环境变量 建立Maven管理的工程 用Maven导入Gson包, 编写简易Json输出程序 步骤: 1. 首先到 ...

  6. ArrayList LinkedList Vector

    ArrayList是基于数组实现的,没有容量的限制. 在删除元素的时候,并不会减少数组的容量大小,可以调用ArrayList的trimeToSize()来缩小数组的容量. ArrayList, Lin ...

  7. parted命令分区

    http://soft.chinabyte.com/os/447/12439447.shtml http://blog.163.com/warking_xp/blog/static/103910320 ...

  8. Qt入门(15)——使用窗口部件

    下面是如何创建一个你自己的窗口部件,描述如何控制一个窗口部件的最小大小和最大大小,并且介绍了窗口部件的名称. class MyWidget : public QWidget { public: MyW ...

  9. sed删除文本第一个匹配行

    源文本如下,要求删除第一个为happy-123456的行. ----------------------------- aaaaaaa happy- bbbbbb asdasawe happy- ds ...

  10. 【二分】【最长上升子序列】HDU 5489 Removed Interval (2015 ACM/ICPC Asia Regional Hefei Online)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5489 题目大意: 一个N(N<=100000)个数的序列,要从中去掉相邻的L个数(去掉整个区间 ...