• 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;
  • 相关阅读:
    mysql 5.7开启sql日志的配置
    Apache显示目录列表及icons目录的问题
    WebGL学习笔记二——绘制基本图元
    java上传文件类型检测
    binlog
    vs2015下C4819该文件包含不能在当前代码页(936)中表示的字符问题解决
    WebGL学习笔记一
    vs2015 debug时出现 C2039“cout”: 不是“std”的成员
    spring boot实现切割分片上传
    springboot自定义类@Resource注入为null的问题
  • 原文地址:https://www.cnblogs.com/XCoderLiu/p/4396058.html
Copyright © 2020-2023  润新知