• 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!
    ";
            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;
  • 相关阅读:
    Lotto--poj2245
    Avoid The Lakes--poj3620
    Fire Net--hdu1045
    变形课--hdu1181
    Apache Mina入门实例
    谈谈项目
    设计模式之装饰者模式
    linux下的权限控制
    centos 6.5 搭建JSP运行环境
    centos 6.5 搭建ftp服务器
  • 原文地址:https://www.cnblogs.com/XCoderLiu/p/4396058.html
Copyright © 2020-2023  润新知