免费注册 查看新帖 |

Chinaunix

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

为什么select的超时不准确? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-20 11:34 |只看该作者 |倒序浏览
我的代码是
tval.tv_sec=5;
tval.tv_usec=0;
....
send(sockfd,(char *)&Req,sizeof(RequestStruct<T>,0);
if (select(fdmax+1, &read_fds, NULL, NULL, &tval)==0) //超时
        {
                puts ("re init time out ";
        }
明明设置了超时为5秒,但执行的结果是根本等不到5秒就报超进了,通常只有几十毫秒后就报超时.

这是为什么呢?怎么才能让select按指定的时间来报超时呢?

论坛徽章:
0
2 [报告]
发表于 2005-01-20 11:47 |只看该作者

为什么select的超时不准确?

代码贴的不全,无法看出出了什么情况

论坛徽章:
0
3 [报告]
发表于 2005-01-20 12:59 |只看该作者

为什么select的超时不准确?

sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
        {
        printf("Socket  Error: Create Socket  failed\n";
        return ;
        }   
memset(&addr,0,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr=inet_addr(IP);
memset(&addr.sin_zero,0,;
memset(&Req,0,sizeof(Req));
if (connect(sockfd, (struct sockaddr *)&addr,sizeof(struct sockaddr)) == -1)
        {
            printf("Can not Connect to %s:%d\n",IP,PORT);
        return ;
     }
FD_ZERO(&read_fds);
FD_SET(sockfd, &read_fds);
fdmax = sockfd;
tval.tv_sec=5;
tval.tv_usec=0;


......
send(sockfd,(char *)&Req,sizeof(RequestStruct<T>,0);
if (select(fdmax+1, &read_fds, NULL, NULL, &tval)==0) //超时
        {
                puts ("time out ";

        }
else
        {
        if ((nbytes=recv(sockfd, (char *)&Rsp, sizeof(ResponseStruct<T>, 0)) <= 0)
                {
                  return -3;
            }
           else
                   {
                   return 1;
                                }
}

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2005-01-20 13:17 |只看该作者

为什么select的超时不准确?

在不同的系统中对tval的处理是不一样的,有的系统调用后会修改tval的值,在每次select前都重新赋值吧

论坛徽章:
0
5 [报告]
发表于 2005-01-20 14:04 |只看该作者

为什么select的超时不准确?

以下部分摘自<Linux Manual Document >;
"
On Linux, the function select modifies timeout to reflect the amount of time not slept; most other implementations do not do this. This causes problems both when Linux code which reads timeout is ported to other operating systems, and when code is ported to Linux that reuses a struct timeval for multiple selects in a loop without reinitializing it. Consider timeout to
be undefined after select returns
.
"
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP