zoukankan      html  css  js  c++  java
  • TCP keepAlive

     路上,有朋友说到服务端异常死掉,而客户端无法感知的情况。我说可以用KEEPLIVE去增加检测,刚好,网上有一文章写得很详细。

    <以下是转>http://space.itpub.net/25259598/viewspace-684112

    在一个正常的TCP连接上,当我们用无限等待的方式调用下面的Recv或Send的时候:

       ret=recv(s,&buf[idx],nLeft,flags);

       或

       ret=send(s,&buf[idx],nLeft,flags);

       如果TCP连接被对方正常关闭,也就是说,对方是正确地调用了closesocket(s)或者shutdown(s)的话,那么上面的Recv或Send调用就能马上返回,并且报错。这是由于closesocket(s)或者shutdown(s)有个正常的关闭过程,会告诉对方“TCP连接已经关闭,你不需要再发送或者接受消息了”。但是,如果是网线突然被拔掉,TCP连接的任何一端的机器突然断电或重启动,那么这时候正在执行Recv或Send操作的一方就会因为没有任何连接中断的通知而一直等待下去,也就是会被长时间卡住。这种情形解决的办法是启动TCP编程里的keepAlive机制。

        struct TCP_KEEPALIVE inKeepAlive = {0};
        unsigned long ulInLen = sizeof(struct TCP_KEEPALIVE);
        struct TCP_KEEPALIVE utKeepAlive = {0};
        unsigned long ulOutLen = sizeof(struct TCP_KEEPALIVE);
        unsigned long ulBytesReturn = 0;

        inKeepAlive.onoff=1;
        inKeepAlive.keepaliveinterval=5000; //单位为毫秒
        inKeepAlive.keepalivetime=1000;      //单位为毫秒
        ret=WSAIoctl(s, SIO_KEEPALIVE_VALS, (LPVOID)&inKeepAlive, ulInLen, 
                              (LPVOID)&outKeepAlive, ulOutLen, &ulBytesReturn, NULL, NULL);

       此处的keepalivetime表示的是TCP连接处于畅通时候的探测频率,一旦探测包没有返回,就以keepaliveinterval的频率发送,经过若干次的重试,如果探测包都没有返回,那么就得出结论:TCP连接已经断开,于是上面的Recv或Send调用也就能马上返回,不会无限制地卡住了。

      上图是对上面文字的说明。亮条之前,TCP处于畅通状态,KeepAlive是以1000毫秒(keepalivetime的值)的频率发送探测包,在发送到第32个探测包的时候,探测包没有返回,于是就以5000毫秒(keepalivetime的值)的频率发送探测包,重发几次后,探测包都没有返回,于是就得出结论:此TCP连接已经断开了!

     

    对于Win2K/XP/2003,可以从下面的注册表项找到影响整个系统所有连接的keepalive参数:


    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]

    “KeepAliveTime”=dword:006ddd00
    “KeepAliveInterval”=dword:000003e8
    “MaxDataRetries”=”5″

     

      对于实用程序来说,2小时的空闲时间太长。因此,我们需要手工开启Keepalive功能并设置合理的Keepalive参数。在XP和WIN2003系统上,可以针对单独的socket来设置,但是在windows 2000,不能单独设置,如果设置,那么影响是整个系统的所有socket。

  • 相关阅读:
    centos 搭建ftp服务器
    一种让超大banner图片不拉伸、全屏宽、居中显示的方法
    使用.Htaccess文件实现301重定向常用的七种方法
    Memcached和Memcache安装(64位win7)
    WDCP各种停止重启命令
    php面向对象之构造函数作用与方法
    Yii2.0 rules验证规则大全
    Yii2.0怎么设置时区?
    如何安装PHPstorm并配置php运行环境运行php项
    linux 装composer的出现的问题
  • 原文地址:https://www.cnblogs.com/lidabo/p/2720258.html
Copyright © 2011-2022 走看看