欢迎您的来访!有源码,好建站(www.codehy.com)源码海洋源码网为您提供快速建站平台.
当前位置: 首页 > 行业资讯 > c# .net 资料 >

C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳)

时间:2021-07-12 00:01来源:未知 作者:admin 点击:
在使用 TcpClient 网络连接中常常会发生客户端连接异常断开, 服务端需要设置检测手段进行这种异常的处理; 1、对于短连接, 通过对 Socket 属性ReceiveTimeout 和 SendTimeout 设置恰当的值, 使得程序在进行读/写时超时, 会产生 SocketException 异常, 通过检

 在使用 TcpClient 网络连接中常常会发生客户端连接异常断开, 服务端需要设置检测手段进行这种异常的处理;

 
1、对于短连接,
 
通过对 Socket 属性ReceiveTimeout 和 SendTimeout 设置恰当的值, 使得程序在进行读/写时超时, 会产生 SocketException 异常, 通过检查这个异常并进行处理,来完成对异常断开的检测处理. 服务端连接处理代码如下:
 
Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, true);     //必须先启用接收超时选项,设置接收超时才有用。   
 
Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, true);     //必须先启用发送超时选项,设置发送超时才有用。        
 
Socket.ReceiveTimeOut=10000;//毫秒
 
Socket.SendTimeOut=10000;//毫秒
 
2、对于长连接
 
可以通过 Socket 中的心跳检测机制进行处理.
 
Socket的底层IO一般通过 WSAIoctl 函数进行设置. C# 中对此函数进行了封装, 即Socket.IOControl 方法.
 
publicint IOControl(
 
    IOControlCode ioControlCode,
 
    byte[] optionInValue,
 
    byte[] optionOutValue
 
)
 
其中第一个参数为 Socket IO 控制代码; 第二个参数为传入参数值, 第三个参数为传出值.
 
在Winsock 2 中定义了许多 Socket IO 控制类型 , 其中有一项: KeepAliveValues , 控制 TCP keep-alive 数据包的发送以及发送间隔。默认值为2个小时, 当间隔时间超过这个设定后, socket就会连续发送5次连接信号, 若客户端无回应, 则此 client socket会断开.
 
我们可以如下调整这个间隔时间:
 
newClient.Client.IOControl(IOControlCode.KeepAliveValues,BitConverter.GetBytes(120), null); // 设置为 2分钟.
 
以上即为2种网络异常连接断线检测的设置方法.
 
(责任编辑:admin)本文地址:http://www.codehy.com/info/net/2021/0712/22476.html

推荐资讯