免费注册 查看新帖 |

Chinaunix

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

在tcp的常连接中,如果长时间的没有数据,则tcp链路会自动断掉吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-01 12:08 |只看该作者 |倒序浏览
在tcp的常连接中,如果链路中长时间的没有数据,则tcp链路会自动断掉吗?这就是在系统应用层上增加回响测试报文以维持链路激活的原因吗(echo test)?

[ 本帖最后由 jdjkxsl 于 2009-6-1 12:10 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-06-01 12:46 |只看该作者
不会自动断开

论坛徽章:
0
3 [报告]
发表于 2009-06-01 13:19 |只看该作者
每两个小时,tcp自动探测一次,发现对方关闭,则断开连接
除非应用层有特殊要求(比如要求每5分钟探测一次),否则不需要关心这个问题

论坛徽章:
0
4 [报告]
发表于 2009-06-01 13:31 |只看该作者

回复 #3 llxxtnt 的帖子

有个socket的keepalive option可设置时间

论坛徽章:
0
5 [报告]
发表于 2009-06-01 13:59 |只看该作者
原帖由 bobcuer 于 2009-6-1 13:31 发表
有个socket的keepalive option可设置时间


我记得keepalive option似乎不能设置时间,只是打开关闭keep alive选项。
设置时间是在另外的地方(好像是sysctl,或者/proc下面),而且这个时间是一个系统只有一个,一旦改变所有程序的keepalive检测时间都变。

论坛徽章:
0
6 [报告]
发表于 2009-06-01 14:25 |只看该作者

回复 #1 jdjkxsl 的帖子

二楼正解。
不判断是不行的,所以上层应用长连接都会有心跳。
要不然,路由断了,或者网线拔了,都不知道网络断了。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
7 [报告]
发表于 2009-06-01 14:27 |只看该作者
好像是一周或者五天, NAT网关好像也有时间限制

论坛徽章:
0
8 [报告]
发表于 2009-06-01 14:36 |只看该作者

回复 #7 xinglp 的帖子

nat网关默认是5天,但是实际上很多网关出厂设置就小于5天的

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
9 [报告]
发表于 2009-06-01 14:50 |只看该作者

回复 #8 llxxtnt 的帖子

看了下我的ADSL路由猫 86400 sec 才一天

论坛徽章:
0
10 [报告]
发表于 2009-06-01 17:18 |只看该作者
原帖由 peimichael 于 2009-6-1 13:59 发表


我记得keepalive option似乎不能设置时间,只是打开关闭keep alive选项。
设置时间是在另外的地方(好像是sysctl,或者/proc下面),而且这个时间是一个系统只有一个,一旦改变所有程序的keepalive检测时间 ...


#include <netinet/tcp.h>//SOL_TCP, TCP_KEEPIDLE 参数的头文件
int keepAlive = 1;   // 开启keepalive属性
int keepIdle = 180;   // 如该连接在180秒内没有任何数据往来,则进行探测
int keepInterval = 5;  // 探测时发包的时间间隔为5 秒
int keepCount = 3;   // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.


if((SOCKET = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
    printf("**CreateSocket: error code = %d,error string = %s \n", errno, strerror(errno));
    printf("**CreateSocket: create Socket failed !\n");
  return -1;
}

if(setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, &m, sizeof(int)) != 0)
{
    printf("**CreateSocket: error code = %d,error string = %s \n", errno, strerror(errno));
    return -1;
}

if(setsockopt(SOCKET, SOL_SOCKET, SO_RCVTIMEO, &t, sizeof(struct timeval)) != 0)
{
    printf("**CreateSocket: error code = %d,error string = %s \n", errno, strerror(errno));
    return -1;
}

//SET KEEPALIVE ATTRIBUTE
if(setsockopt(SOCKET, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive)) != 0)
  {
     printf("**BindSocket: error code = %d,error string = %s \n", errno, strerror(errno));
     return -1;
  }

  if(setsockopt(SOCKET, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle)) != 0)
  {
     printf("**BindSocket: error code = %d,error string = %s \n", errno, strerror(errno));
     return -1;
  }

  if(setsockopt(SOCKET, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval)) != 0)
  {
     printf("**BindSocket: error code = %d,error string = %s \n", errno, strerror(errno));
     return -1;
  }

  if(setsockopt(SOCKET, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount)) != 0)
  {
     printf("**BindSocket: error code = %d,error string = %s \n", errno, strerror(errno));
     return -1;
  }

[ 本帖最后由 learntolinux 于 2009-6-1 17:23 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP