免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-14 10:43 |只看该作者 |倒序浏览
大家好,早对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.                 }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP