当前位置: 首页 > news >正文

Set Keep-Alive Values---C到C#代码的转换

一、什么是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(0)]
11     [
12           System.Runtime.InteropServices.MarshalAs
13            (
14                System.Runtime.InteropServices.UnmanagedType.ByValArray,
15                SizeConst = 12
16            )
17     ]
18     public fixed byte Bytes[12];
19 
20     [System.Runtime.InteropServices.FieldOffset(0)]
21     public uint On_Off;
22         
23     [System.Runtime.InteropServices.FieldOffset(4)]
24     public uint KeepaLiveTime;
25         
26     [System.Runtime.InteropServices.FieldOffset(8)]
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 = -1;
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[12];
49 
50         for (int I = 0; I < 12; 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, 36000000, 1000);

 

 

转载于:https://www.cnblogs.com/CnKker/p/3197615.html

相关文章:

  • poj 2388 Who's in the Middle(快速排序求中位数)
  • com.javax.servlet 慢慢看完慢慢学完
  • margin标记可以带一个、二个、三个、四个参数,各有不同的含义。
  • jQuery – 8.事件和事件参数
  • 面试题20:栈的压入、弹出序列
  • 求字符串组合
  • PHP event 事件机制
  • 基于协同过滤的推荐引擎
  • 连续加班易“脑残”,程序员做做白日梦未尝不是一件好事!
  • Manacher模板,kmp,扩展kmp,最小表示法模板
  • linux修改文件读写执行权限命令chmod
  • right-click an action, missing Go to slot
  • 零售门店促销创新的八个思路
  • 华为C8812获取对system分区的读写权限
  • C#路径的相关操作
  • 2017-09-12 前端日报
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Create React App 使用
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • JavaScript 奇技淫巧
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • php的插入排序,通过双层for循环
  • use Google search engine
  • 分布式事物理论与实践
  • 记录一下第一次使用npm
  • 浏览器缓存机制分析
  • 排序(1):冒泡排序
  • 使用SAX解析XML
  • 听说你叫Java(二)–Servlet请求
  • 我这样减少了26.5M Java内存!
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 如何正确理解,内页权重高于首页?
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • # 透过事物看本质的能力怎么培养?
  • #ifdef 的技巧用法
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • ()、[]、{}、(())、[[]]命令替换
  • (1)(1.13) SiK无线电高级配置(五)
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)http-server应用
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • *** 2003
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .equals()到底是什么意思?
  • .NET delegate 委托 、 Event 事件
  • .Net 路由处理厉害了
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net中生成excel后调整宽度
  • @FeignClient注解,fallback和fallbackFactory
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [BT]BUUCTF刷题第8天(3.26)
  • [CDOJ 838]母仪天下 【线段树手速练习 15分钟内敲完算合格】