- 论坛徽章:
- 0
|
大家好,早对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秒,大家帮忙讨论讨论吧...,看看有啥办法没,谢谢,我的代码如下:
- int sk,ret;
- struct timeval tv;
- fd_set rdevents, wrevents;
- if ((sk=socket(AF_INET, SOCK_STREAM, 0))<0)
- {
- perror("Socket build fail\n");
- return ERROR;
- }
- if( ioctl(sk,FIONBIO,&non_blocking) == -1 )
- perror("*********** ioctlsocket ");
- ret = connect(sk, (struct sockaddr *)&destserver, sizeof(destserver));
- if ( 0 == ret)
- {
- printf("connect success...\n");
- ioctl(sk,FIONBIO,&blocking);
- break;
- }
- else if( (0 != ret) && (errno != EINPROGRESS) )
- {
- close(sk);
- perror("cannot conenct to server \n");
- continue;
- }
- else
- {
- FD_ZERO(&wrevents);
- FD_SET(sk, &wrevents);
- rdevents = wrevents;
- tv.tv_sec = 30; //在这里设置connect的超时时间,但如果大于7就不起作用 !!!
- tv.tv_usec = 0;
- //下面select总是在7秒内返回 !!!!!!!!
- ret = select(sk+1, (fd_set *)&rdevents, (fd_set *)&wrevents, (fd_set *)0, &tv);
- ……
- }
复制代码
[ 本帖最后由 bumingwu 于 2008-1-14 10:43 编辑 ] |
|