免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 895 | 回复: 0
打印 上一主题 下一主题

Linux下TCP keepalive属性的表现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-20 15:28 |只看该作者 |倒序浏览

                                tcp是面向连接的,在实际应用中通常都需要检测连接是否还可用.如果不可用,可分为:a. 连接的对端正常关闭.b. 连接的对端非正常关闭,这包括对端设备掉电,程序崩溃,网络被中断等.这种情况是不能也无法通知对端的,所以连接会一直存在,浪费国家的资源.tcp协议栈有个keepalive的属性,可以主动探测socket是否可用,不过这个属性的默认值很大.全局设置可更改/etc/sysctl.conf,加上:net.ipv4.tcp_keepalive_intvl = 20net.ipv4.tcp_keepalive_probes = 3net.ipv4.tcp_keepalive_time = 60在程序中设置如下:
    #include sys/socket.h>
  #include netinet/in.h>
  #include arpa/inet.h>
  #include sys/types.h>
  #include netinet/tcp.h>
  int keepAlive = 1;    // 开启keepalive属性
  int keepIdle = 60;    // 如该连接在60秒内没有任何数据往来,则进行探测
  int keepInterval = 5; // 探测时发包的时间间隔为5 秒
  int keepCount = 3;    // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
  setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
  setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
  setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
  setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
  
在程序中表现为,当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select会返回socket可读,并且在recv时返回-1,同时置上errno为ETIMEDOUT.
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/870/showart_501020.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP