免费注册 查看新帖 |

Chinaunix

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

[网络管理] 求助socket connect超时问题,急!!!!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-14 10:23 |只看该作者 |倒序浏览
大家好,早对chinaunix大名有耳闻,自己也常常在此搜索资料,现在我在socket通信方面遇到点问题,想向大家请教下。   

硬件平台:ARM9   
软件平台:ECOS       网络协议栈(FreeBSD)   

问题描述:

    两块板卡,一块跑 TCP socket Server(accept),一块跑 TCP socket Client(connect),都接入大网环境中(同一层楼的局域网),一个专门发数据,一个专门收数据,通信时间只能连续持续几个小时,然后出现“Broken  Pipe”和“Connect  Reset  By  Peer”的错误,send、recv函数都返回-1退出了。接下来我就想当出现错误时在程序中让它们自动重连然后再收发,也就是 Client:先close(sk)、重新socket、connect,而Server端一直有个任务在accept,结果现象是,前面几次重连过程中Client都是要连好几次或十几次(中间有时间不等的延时)才能连上,到后来(几个小时后)两者就怎么也连不上了(TCP三次握手不成功),试过很多方法都不行(l_onoff=1; l_linger=0等等)。后来发现ecos下的connect为7秒超时,而抓包发现不管是ARP请求还是TCP SYN,双方的响应都很迟钝(不知为什么),十多秒后对方才reply是很经常的事,所以connect不上也很正常吧。

    那就更改connect的超时时间,通用的方法:设置非阻塞socket、connect、设置time、select.、判断可写否、getsockpot,但我发现time的值在7s以内都是生效的,大于7秒时,都是在7s的时候select返回,在ecos库中寻找相关线索也无果(可能是自己还不了解)   

    问题就是怎样让connect的超时时间大于7秒,大家帮忙讨论讨论吧...,看看有啥办法没,谢谢,我的代码如下:

  1.         int sk,ret;
  2.         struct timeval tv;
  3.         fd_set rdevents, wrevents;

  4.                 if ((sk=socket(AF_INET, SOCK_STREAM, 0))<0)
  5.                 {
  6.                          perror("Socket build fail\n");
  7.                          return        ERROR;
  8.                 }

  9.                 if( ioctl(sk,FIONBIO,&non_blocking) == -1 )
  10.                         perror("*********** ioctlsocket  ");

  11.                 ret = connect(sk, (struct sockaddr *)&destserver, sizeof(destserver));

  12.                 if ( 0 == ret)
  13.                 {
  14.                         printf("connect success...\n");
  15.                         ioctl(sk,FIONBIO,&blocking);
  16.                         break;
  17.                 }
  18.                 else if( (0 != ret) && (errno != EINPROGRESS) )
  19.                 {
  20.                         close(sk);
  21.                         perror("cannot conenct to server \n");
  22.                         continue;
  23.                 }
  24.                 else
  25.                 {
  26.                         FD_ZERO(&wrevents);
  27.                         FD_SET(sk, &wrevents);
  28.                         rdevents = wrevents;

  29.                         tv.tv_sec = 30;  //在这里设置connect的超时时间,但如果大于7就不起作用 !!!
  30.                         tv.tv_usec = 0;
  31.                                                //下面select总是在7秒内返回 !!!!!!!!
  32.                         ret = select(sk+1, (fd_set *)&rdevents, (fd_set *)&wrevents, (fd_set *)0, &tv);
  33.                         ……
  34.                 }
复制代码

[ 本帖最后由 bumingwu 于 2008-1-14 10:43 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-01-14 10:28 |只看该作者
看一下内核协议栈 TCP 部分有没有相关时间设置,也许这个 7 秒是在 tcp.c 里面的
只是猜测,没有看代码

论坛徽章:
0
3 [报告]
发表于 2008-01-14 10:54 |只看该作者
试下socket option得 resue选项。还有你的rdevents , wrevents 是怎么做的? 好像上面的代码没有看到。 多show点code出来,不然只能凭想象了:)

论坛徽章:
0
4 [报告]
发表于 2008-01-14 11:15 |只看该作者
谢谢大家!

platinum (何时才能飞):那个7秒其实也是我大概估计的,我曾用7作为关键字搜索了下库,没有什么明显的发现(其实也很难看得出),在configtool的图形配置工具里也没找到,tcp.h刚才看了下,也没有可疑线索 :(

bshawk :您说的是SO_REUSEADDR和SO_REUSEPORT选项吗,这个我刚才也试过了,没有效果。其实我的问题就是在select语句上,它没有按照我设定的值(大于7秒时)就提前返回了,所以之后的行为也就不用考虑了。

论坛徽章:
0
5 [报告]
发表于 2008-01-14 11:28 |只看该作者
返回的值倒是对的,比如连接一个不存在的IP,就返回2(如果连接上了应该是1),但是就是到了7秒(左右)就返回,郁闷。。。。

[ 本帖最后由 bumingwu 于 2008-1-14 11:30 编辑 ]

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
6 [报告]
发表于 2008-01-14 11:36 |只看该作者
还是从更底层分析造成延迟的原因吧!
是板子本身的问题还是驱动方面的问题还是网络阻塞。

论坛徽章:
0
7 [报告]
发表于 2008-01-14 17:09 |只看该作者
从其他方面可以说明板子和驱动应该问题不大,不过以后还是要重新check下,现在就是想找个法(增大connect的超时时间)绕过去。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP