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;