linux connect超时方法

来源:互联网 发布:订单管理数据流程图 编辑:程序博客网 时间:2024/05/17 05:14
1. 用信号超时,代码量小,更精巧
  1. void u_alarm_handler()
  2. {
  3. }

  1. sigset(SIGALRM, u_alarm_handler);
  2. alarm(2);
  3. code = connect(socket_fd,(struct sockaddr*)&socket_st, sizeof(struct sockaddr_in));
  4. alarm(0);
  5. sigrelse(SIGALRM);


2. 使用非阻塞
int error =-1,len;
timeval tm;
fd_set set;
unsigned long ul = 1;
ioctl(sock,FIONBIO,&ul);
bool ret;
if (::connect (sock, (struct sockaddr *) &destSin, sizeof (destSin)) < 0)
{
    tm.tv_sec = 2;
    tm.tv_usec = 0;
    FD_ZERO(&set);
    FD_SET(sock,&set);
    if(select(sock+1,NULL,&set,NULL,&tm)>0 && FD_ISSET(sock,&set)!=0)
    {
        getsockopt(sock,SOL_SOCKET,SO_ERROR,&error,(socklen_t*)&len);
        if(error ==0)
        {
            ret = true;
        }else{
            ret = false;
        }
    }else{
        ret =  false;
    }
    if(!ret)
    {
        if(sock != -1)
            ::close(sock);
        sock = -1;
        return TVS_CONN_FAIL;
    }

}
//设置为非阻塞模式
ul = 0;
ioctl(GPro->iAnalyseSock,FIONBIO,&ul);


    
    
0 0
原创粉丝点击