精华内容
下载资源
问答
  • C# KeepAlive的设置

    2015-11-02 14:38:00
    C# KeepAlive的相关设置 网上有很多相关KeepAlive的内容,终于找到了有关C#的这方面资料,设置了下,有行可靠! TcpListener myListener = new TcpListener(IPAddress.Any, port);//绑定端口IP信息 ...

      C# KeepAlive的相关设置

    网上有很多相关KeepAlive的内容,终于找到了有关C#的这方面资料,设置了下,有行可靠!

     TcpListener myListener = new TcpListener(IPAddress.Any, port);//绑定端口IP信息
     
     myListener.Start();//开始监听
    
     TcpClient newClient=myListener.AcceptTcpClient();//接受请求
    
     newClient.Client.IOControl(IOControlCode.KeepAliveValues, KeepAlive(1, 30000, 10000), null);//设置Keep-Alive参数
    
     private byte[] KeepAlive(int onOff, int keepAliveTime, int keepAliveInterval)
     {
         byte[] buffer = new byte[12];
         BitConverter.GetBytes(onOff).CopyTo(buffer, 0);
         BitConverter.GetBytes(keepAliveTime).CopyTo(buffer, 4);
         BitConverter.GetBytes(keepAliveInterval).CopyTo(buffer, 8);
         return buffer;
      }
    

     

    KeepAlive函数参数说明:

    onOff:是否开启KeepAlive

    keepAliveTime:开始首次KeepAlive探测前的TCP空闭时间

    keepAliveInterval: 两次KeepAlive探测间的时间间隔

    Keep-Alive的位置我是放在收到客户端以后,对每个连入的客户端都设置一次。

     

    相关文章:http://www.cnblogs.com/lidabo/p/4253356.html

     

    转载于:https://www.cnblogs.com/legendtao/p/4930098.html

    展开全文
  • c# socket KeepAlive 心跳

    2020-11-23 09:48:46
    } } } /// /// tcpclient extension method /// public static class TcpClientKeepAliveFeature { /// /// enable keepalive /// /// public static void EnableKeepAlive(this TcpClient tcpClient, uint ...
    using System;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    
    namespace SocketKeepAliveSharp
    {
        class Program
        {
            /// <summary>
            /// main
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                var listener = new TcpListener(IPAddress.Any, 5000);
                while (true)
                {
                    Console.WriteLine("start");
                    listener.Start();
                    Console.WriteLine("waiting tcp client connection...");
                    using var client = listener.AcceptTcpClient();
                    listener.Stop();
                    Communication(client);
                }
            }
    
            /// <summary>
            /// communication method
            /// </summary>
            /// <param name="client"></param>
            static void Communication(TcpClient client)
            {
                client.ReceiveTimeout = -1;
                client.EnableKeepAlive(3000, 5000);
                try
                {
                    Console.WriteLine("connected.");
                    while (true)
                    {
                        var data = client.GetStream().ReadByte();
                        if (0 > data)
                        {
                            Console.WriteLine("disconnect");
                            break;
                        }
                    }
                }
                catch (IOException)
                {
                    Console.WriteLine($"connection lost");
                }
            }
        }
    
    
        /// <summary>
        /// tcpclient extension method
        /// </summary>
        public static class TcpClientKeepAliveFeature
        {
            /// <summary>
            /// enable keepalive
            /// </summary>
            /// <param name="socket"></param>
            public static void EnableKeepAlive(this TcpClient tcpClient, uint keepAliveTimeMilliseconds, uint keepAliveIntervalMilliseconds)
            {
                var socket = tcpClient.Client;
                var tcpKeepalive = new byte[12];
                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);     // enable keep-alive
                BitConverter.GetBytes((uint)1).CopyTo(tcpKeepalive, 0);                                 // switch on
                BitConverter.GetBytes(keepAliveTimeMilliseconds).CopyTo(tcpKeepalive, 4);               // wait time(ms)
                BitConverter.GetBytes(keepAliveIntervalMilliseconds).CopyTo(tcpKeepalive, 8);           // interval(ms)
                socket.IOControl(IOControlCode.KeepAliveValues, tcpKeepalive, null);                    // set keep-alive parameter
            }
    
            /// <summary>
            /// disable keepalive
            /// </summary>
            /// <param name="tcpClient"></param>
            public static void DisableKeepAlive(this TcpClient tcpClient)
            {
                var socket = tcpClient.Client;
                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, false);     // disable keep-alive
            }
        }
    }
    
    
    展开全文
  • C# Socket 长连接设置Keepalive 大洋彼岸789 Socket 首先TCP 底层自带KeepAlive 连接监测机制,通常在指定时间:keepalivetime(毫秒)内没有数据交互,则按keepaliveinterval(毫秒)设定重复发送keep-alive包,...

    C# Socket 长连接设置Keepalive

    大洋彼岸789
    Socket

    首先TCP 底层自带KeepAlive 连接监测机制,通常在指定时间:keepalivetime(毫秒)内没有数据交互,则按keepaliveinterval(毫秒)设定重复发送keep-alive包,并且重复次数达到设置值或系统默认值,例如win10系统为10次,如果都没有回应,则视为客户端异常或网络中断,表现为TCP底层发送Reset 指令,连接断开。

    实验如下:

    首先更改开启KeepAlive ,并且设置首次没有数据交互发探测包的间隔为5s, 探测间隔为1s: C# 版本如下:

            #region 连接
            /// <summary>
            /// 异步连接
            /// </summary>
            /// <param name="ip">要连接的服务器的ip地址</param>
            /// <param name="port">要连接的服务器的端口</param>
            public void ConnectAsync(string ip, int port)
            {
                IPAddress ipAddress = null;
                try
                {
                    ipAddress = IPAddress.Parse(ip);
                }
                catch (Exception)
                {
                    throw new Exception("ip地址格式不正确,请使用正确的ip地址!");
                }
                try
                {
                    if (!tcpClient.Connected)
                    {
                        tcpClient.BeginConnect(ipAddress, port, ConnectCallBack, tcpClient);
                    }
                    else if (isStopWork)
                    {
                        isStopWork = false;
                        OnComplete(tcpClient, SocketAction.Connect);
                    }
                }
                catch
                {
                }            
            }
     
            /// <summary>
            /// 异步连接的回调函数
            /// </summary>
            /// <param name="ar"></param>
            private void ConnectCallBack(IAsyncResult ar)
            {
                try
                {
                    TcpClient client = ar.AsyncState as TcpClient;
                    client.EndConnect(ar);
                    uint dummy = 0;
                    byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
                    BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);//启用Keep-Alive
                    BitConverter.GetBytes((uint)5000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));//在这个时间间隔内没有数据交互,则发探测包 毫秒
                    BitConverter.GetBytes((uint)1000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);//发探测包时间间隔 毫秒
                    client.Client.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
                    OnComplete(client, SocketAction.Connect);
                }
                catch(Exception ex)
                {
                    
                }           
            }
            #endregion
    利用wireshark抓包如下:

    接下来测试KeepAlive断开:正常TCP建立连接 后,拔掉网线:重新抓包如下图所示:

    由上图可以看到在每5秒发keepalive探测包后,由于拔掉网线,140(客户端)给151(服务器端)发了连续10个keepalive探测重试包,时间间隔为1s; 10次后,最终导致TCP指令RST (reset)发出,标识连接异常断开。

    启用KeepAlive机制后,对于TCP因为物理链路上断开的连接,可以更快的感知发现。正常情形下TCP连接双方建立连接后,即使物理层链路断开,例如拔掉网线等,TCP连接仍视为正常连接,此时重新插回网线,仍然可以正常的收发数据,好像网线拔掉从未发生过一样。在拔掉网线后,读和写会有什么影响呢?如果是write, socket 是可以正常返回的,因为write只保证发送到本地缓冲区,直至内核发现对方不可达。同样道理网线拔除后读也回有一个超时感知时间(和SendTimeOut或ReceiveTimeOut无关),C#中会引发SocketExcetion。
    ————————————————
    版权声明:本文为CSDN博主「大洋彼岸789」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/elie_yang/article/details/95197181

    展开全文
  • C#的TCP/IP通讯中,断线重连是一个基础必备的功能,之前比较喜欢用心跳帧来做断线重连,简单又方便。 但是事情往往并不是都能如我们所愿,比如在最近的一个项目中,碰到一个傻逼Server,不支持异步,不能使用心跳帧...

    C#的TCP/IP通讯中,断线重连是一个基础必备的功能,之前比较喜欢用心跳帧来做断线重连,简单又方便。

    但是事情往往并不是都能如我们所愿,比如在最近的一个项目中,碰到一个傻逼Server,不支持异步,不能使用心跳帧,之前的断线重连功能就KeepDie了,嘤嘤嘤。。。

     不过办法总比问题多,经过不懈的Google,终于找到一种根据本地计算机(支持TCPClient的IO操作)网络状态来判断是否断线,并且可以实现完美的KeepAlive。

     

     

    下面是关键代码:

     server = ip.Text;
                Port =Convert.ToInt32( this.port.Text);
                tcpclient = new TcpClient(server, Port);          
                        // 启用keep-alive
                tcpclient.Client.IOControl(IOControlCode.KeepAliveValues, GetKeepAliveData(), null);
                tcpclient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
    
                // Translate the passed message into ASCII and store it as a Byte array.
                Byte[] data = System.Text.Encoding.UTF8.GetBytes("连接开始  发送第一个数据");
    
                // Get a client stream for reading and writing.
                //  Stream stream = client.GetStream();
                
                NetworkStream stream = tcpclient.GetStream();
    
                // Send the message to the connected TcpServer. 
                stream.Write(data, 0, data.Length);

     

            private byte[] GetKeepAliveData()
            {
                uint dummy = 0;
                byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
                BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);
                BitConverter.GetBytes((uint)3000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));//keep-alive间隔
                BitConverter.GetBytes((uint)500).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);// 尝试间隔
                return inOptionValues;
            }

    下面是效果展示:

    关闭服务器连接:

    一段时间之后打开服务器:

    话不多说,直接DEMO

    展开全文
  • Using TCP/IP KeepAlive in C#I have been trying to make NetSocket.SetSocketOption work for TCP/IP KeepAliveI have tried the following codepublic virtual void SetKeepAlive (ulong keepalive_time, ulong ...
  • 本文简述了 C# 中 GC.KeepAlive 函数的实际作用 一直以为 GC.KeepAlive 可以用于使某个托管对象永久的不被垃圾回收(调用该函数后需要主动进行 Free 之类的操作,类似于 GCHandle),但事实证明自己还是犯了望文生义的...
  • grpc keepalive使用指南

    千次阅读 2019-11-18 18:01:01
    keepalive ping是一种通过transport发送HTTP2 ping来检查通道当前是否...本指南记录了gRPC core中控制keepalive ping行为方式。 keepalive ping由两个重要的通道参数控制: GRPC_ARG_KEEPALIVE_TIME_MS 此channe...
  • tcp 开启keepalive

    2020-04-10 10:19:33
    开启keepalive 策略: 我们通常需要调整触发 KeepAlive 的 idle 时间间隔: s.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, 10) 最后一个参数 10 表示在连接不活跃 10s 后开始 KeepAlive 检测。 s....
  • HttpWebRequest关于KeepAlive

    千次阅读 2010-12-23 12:14:00
    HttpWebRequest关于KeepAlive的作用,那天遇到个和服务器协议冲突 搞了这么长时间的HttpWebRequest,还是第一次遇到。 去网上查查资料,发现是keepAlive不能为true,也就是 服务器不允许链接?...
  • 修改socket为keepAlive

    2016-12-23 16:38:00
    参考文章:... [root@mdw-2 gpadmin]# vi /etc/sysctl.conf 追加添加如下: ...net.ipv4.tcp_keepalive_time=90 net.ipv4.tcp_keepalive_intvl=15 net.ipv4...
  • MQTT 心跳和keepalive配置

    千次阅读 2020-05-17 00:39:36
    MQTT 心跳和keepalive配置 内容: 正常MQTT 服务器端会配置一个超时时间,一般为60s, 在这个时间段内一个连接如果没有数据传输的话,服务端会主动断开连接以释放资源, 有两种方式可以规避这个问题: 方式1: 最为...
  • HTTP 的keepalive模式

    2014-09-03 10:50:44
    故事发生在10月份的一次面试经历中,本来我不想说出来丢人显眼,但是为了警醒自己和告诫后人,我决定写成博文发... & C#中如何使用POST、GET等。面试官说既然我熟悉HTTP协议,就问“当HTTP采用keepalive模式,当客户端
  • TCP server保活(keepalive)的应用

    千次阅读 2016-11-29 14:04:50
    tcp keepalive保活,服务端应用
  • C# ftpHelper

    2021-02-19 13:40:21
    @C# ftp文件操作类ftpHelper C# ftp文件操作类ftpHelper: 在C#对文件操作的时候,在百度和必应上搜索很多资料,但是没有一个很完善操作ftp文件的ftpHelper类,其他同学写的难免有些差强人意,之后自己想写一个完善的...
  • 长连接和Keepalive详解

    千次阅读 2016-09-01 09:58:26
    短连接在数据包发送完成后就会自己断开,长连接在发包完毕后,会在一定的时间内保持连接,即我们通常所说的Keepalive(存活定时器)功能。 默认的Keepalive超时需要7,200,000 milliseconds,即2小时,探测次数为5次...
  • keepalive实验配置

    2012-03-09 15:13:29
    主的配置: ! Configuration File for keepalived global_defs { notification_email { 894861468@qq.com ... notification_email_from Alexandre.Cassen@firewall.loc ... smtp_server 1...
  • C#C#中FTP的操作

    千次阅读 2018-01-12 15:05:42
    C#完成与FTP服务器交互的功能代码。包括连接FTP、上传文件、下载文件、创建文件夹、删除文件夹、目录列表、获取指定文件大小、对文件的重命名、移动文件、判断路径是否存在等功能。 using System; using System....
  • c# 操作FTP文件类

    千次阅读 2013-09-15 22:31:06
    c# 操作FTP文件类   string ftpServerIP; string ftpUserID; string ftpPassword; FtpWebRequest reqFTP; private void Connect(String path)//连接ftp {
  • C#TCP

    千次阅读 2019-03-28 18:07:50
    C#TCP TCP客户端 TCP服务端 TCP客户端 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using ...
  • c# HttpWebReQuest

    2018-03-01 14:55:03
    request.KeepAlive = false ; request.ProtocolVersion = HttpVersion.Version11; IAsyncResult result = (IAsyncResult)request.BeginGetResponse(GetStatisticCallBack, request); private static void ...
  • SOL_SOCKET, SO_KEEPALIVE

    2011-10-08 22:07:00
    目前手头有个关于心博功能的一个案例, 在使用SOL_SOCKET, SO_KEEPALIVE上有一点心得,想写出来和大家分享一下。 关于SOL_SOCKET选项SO_KEEPALIVE有一个很详细的英文How TO, 在下面的网页中大家可以看到详细的内容...
  • 在写一个自动提交的小...后来发现把KeepAlive属性,显示的设置为True,改为设置False。一切正常。 KeepAlive 是否建立持久的连接! 转载于:https://www.cnblogs.com/zqonline/archive/2009/12/30/1636154.html...
  • C#获取网页源码

    2021-02-23 16:06:59
    C#中如何获得C#源码呢? 有3中方法 WebClient public static string GetWebClient(string url) { try { string strHTML = ""; WebClient myWebClient = new WebClient(); Stream myStream = myWebCli
  • C# FTPHelper

    2016-06-15 11:02:02
     reqFTP.KeepAlive = false;  reqFTP.UseBinary = true;  reqFTP.ContentLength = fileInf.Length;  int buffLength = 2048;  byte[] buff = new byte[buffLength];  int contentLen;  ...
  • C# ftp

    2019-09-19 10:35:52
    C# ftp usingSystem; usingSystem.Configuration; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Net; usingSystem...
  • 举个例子,以我的系统默认设置为例,kernel默认设置的tcpkeepalivetime是7200s, 如果我在应用程序中针对socket开启了KeepAlive,然后设置的TCP_KEEPIDLE为10,那么TCP协议栈在发现TCP链接空闲了10s没有数据传输的时候...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,213
精华内容 1,685
关键字:

c#keepalive

c# 订阅