iOS 设置connect超时

NSLock *theLock;
    [theLock lock];
    int fd, error;
    struct sockaddr_in addr;

    if((fd = socket(AF_INET,SOCK_STREAM,0))<0)
    {
        cout<<"Error: creating socket failed!\n";
        close(fd);
        [theLock unlock];
        return;
    }
    int flags = fcntl(fd, F_GETFL,0);
    fcntl(fd,F_SETFL, flags | O_NONBLOCK);
    //设置tcp超时
    struct timeval timeo = {0,200000};//你想设置的超时时间
    int err = setsockopt(fd,SOL_SOCKET,SO_SNDTIMEO,&timeo,sizeof(timeo));
    if (err) {
        NSLog(@"设置超时失败");
    }
    addr.sin_family = AF_INET;
    addr.sin_port = htons(6095);
    inet_aton([IP UTF8String],&addr.sin_addr);

    error = connect(fd,(sockaddr*)&addr,sizeof(addr));
 //阻塞模式
//    if(error!=0)
//    {
//        cout<<"Error: conecting to server failed!"<<[IP UTF8String]<<endl;
//        close(fd);
//        [theLock unlock];
//        return ;
//    }
//    
//    NSLog(@"Find XiaoMi Server:%@",IP);
//    
//    close(fd);
//    [theLock unlock];
    std::cout<<"Scan:"<<[IP UTF8String]<<endl;
    //非阻塞模式
    if(error < 0 && errno == EINPROGRESS)          //errno == EINPROGRESS表示正在建立链接
    {
        // 等待连接完成,errno == EINPROGRESS表示正在建立链接
        fd_set set;
        FD_ZERO(&set);
        FD_SET(fd,&set);  //相反的是FD_CLR(_sock_fd,&set)

        int retval = select(fd + 1, NULL, &set, NULL, &timeo);           //事件监听
        if(retval < 0)
        {
            //建立链接错误close(_socket_fd)
        }
        else if(retval == 0) // 超时
        {
            //超时链接没有建立close(_socket_fd)
        }
        
        //将检测到_socket_fd读事件或写时间,并不能说明connect成功
        if(FD_ISSET(fd,&set))
        {
            int error = 0;
            socklen_t len = sizeof(error);
            if(getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
            {
                //建立简介失败close(_socket_fd)
            }
            if(error != 0) // 失败
            {
                //建立链接失败close(_socket_fd)
            }
            else
            {
                //建立链接成功
                std::cout<<"Find Http:"<<[IP UTF8String]<<endl;
            }
        }
    }
    else
    {
        //出现错误 close(_sock_fd)
    }
    close(fd);
    return;

 

posted on 2015-04-06 15:45  XCoderLiu  阅读(925)  评论(0编辑  收藏  举报

导航