免费注册 查看新帖 |

Chinaunix

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

想用select() 控制客户端连接超时,自己的代码起不了作用 请各位帮忙看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-18 11:37 |只看该作者 |倒序浏览
主要代码取下:
  . . . . . .
     fd_set rfds;
        struct timeval tv;
        int retval;         

     tv.tv_sec =10;                           
      tv.tv_usec =  0 ;                  
    . . . . .
   if((host=gethostbyname())==NULL  )
{}
if((sockfd=socket(,,,,))==-1)
{}
. . . . .
FD_ZERO(&rfds);
  FD_SET(sockfd,&rfds);
   stat =select(1+sockfd,&rfds,NULL,NULL,&tv);

if(connect(,,,)==-1)
{}
. . . . .
if(stat==-1)
  {     printf("select error\n");
        return 1 ;     ;
}
else if(stat)
{}
else
{
printf("time out");
return 1;
}   
. . . . .


问题:现在select起不到 控制超时的作用 应该是自己没用好
请各为指点一下 如何使用才能达到如果连接超过一定时间 就停止本次连接,不超时的话继续后面的工作。

论坛徽章:
0
2 [报告]
发表于 2007-04-18 12:44 |只看该作者
/*入口参数:ServerAddr要连接的地址,int nsec超时限制秒数
出口参数: -1 连接失败,一般指对端不可达,或者无服务,不关闭SockFd
                -2 连接失败 ,超时退出,关闭SockFd。防止三次握手继续
*/
int  Connect(const int SockFd,struct sockaddr_in  ServerAddr,int nsec)
{
        int flags,n,error;
        fd_set rset,wset;
        socklen_t len;
        struct timeval tval;
        flags=fcntl(SockFd,F_GETFL,0);
        fcntl(SockFd,F_SETFL,flags|O_NONBLOCK);
        error=0;
        if((n=connect(SockFd,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr)))<0)
        {
                if(errno!=EINPROGRESS)
                {                         
                        return -1;
                }
        }
        if(n==0)
                goto done;

        FD_ZERO(&rset);
        FD_SET(SockFd,&rset);
        wset=rset;
        tval.tv_sec=nsec;
        tval.tv_usec=0;
        if((n=select(SockFd+1,&rset,&wset,NULL,nsec?&tval:NULL))==0)
        {       
                ::close(SockFd);                       
                return -2;
        }

        if(FD_ISSET(SockFd,&rset) || FD_ISSET(SockFd,&wset))
        {
                len=sizeof(error);
                if(getsockopt(SockFd,SOL_SOCKET,SO_ERROR,&error,&len)<0)
                {                         
                        return -1;
                }
        }

done:
        fcntl(SockFd,F_SETFL,flags);
        if(error)
        {
                ::close(SockFd);               
                return -2;
        }         
        return 0;
}

论坛徽章:
0
3 [报告]
发表于 2007-04-18 14:32 |只看该作者
谢谢 lvliangliang
但是因为程序结构的问题 我不想采用上面的方法,也不想用goto语句

能不能有怎么用select()的方法 实现我想实现的功能(阻塞式IO),我搜过一些例子都不合适。

或者能有一种比较容易实现的方法,对connect()进行超时控制 超时的话 返回,不的话继续下面的处理

[ 本帖最后由 cc007c 于 2007-4-18 14:36 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-04-18 17:07 |只看该作者
if((sockfd=socket(,,,,))==-1)
{}
. . . . .
FD_ZERO(&rfds);
  FD_SET(sockfd,&rfds);
   stat =select(1+sockfd,&rfds,NULL,NULL,&tv);       //谁来触发它?

if(connect(,,,)==-1)
{}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP