static int timed_connect(int sock, const struct sockaddr *addr, unsigned int len) { int ret,value,value_len; struct pollfd pfd[1]; pfd[0].fd=sock; pfd[0].events=POLLOUT; fcntl(sock, F_SETFL, O_NONBLOCK); ret=true_connect(sock, addr, len); // printf("\nconnect ret=%d\n",ret);fflush(stdout); if(ret==-1 && errno==EINPROGRESS) { ret=poll_retry(pfd,1,tcp_connect_time_out); //printf("\npoll ret=%d\n",ret);fflush(stdout); if(ret == 1) { value_len=sizeof(int); getsockopt(sock,SOL_SOCKET,SO_ERROR,&value,&value_len) ; //printf("\nvalue=%d\n",value);fflush(stdout); if(!value) ret=0; else ret=-1; } else { ret=-1; } } else { if (ret != 0) ret=-1; } fcntl(sock, F_SETFL, !O_NONBLOCK); return ret; }
static int read_n_bytes(int fd, char *buff, size_t size) { int ready; size_t i; struct pollfd pfd[1]; pfd[0].fd = fd; pfd[0].events = POLLIN; for(i = 0; i < size; i++) { pfd[0].revents = 0; ready = poll_retry(pfd, 1, tcp_read_time_out); if(ready != 1 || !(pfd[0].revents & POLLIN) || 1 != read(fd, &buff[i], 1)) return -1; } return (int) size; }
static int read_line(int fd, char *buff, size_t size) { int i,ready; struct pollfd pfd[1]; pfd[0].fd=fd; pfd[0].events=POLLIN; for(i=0;i<size-1;i++) { pfd[0].revents=0; ready=poll_retry(pfd,1,tcp_read_time_out); if(ready!=1 || !(pfd[0].revents&POLLIN) || 1!=read(fd,&buff[i],1)) return -1; else if(buff[i]=='\n') { buff[i+1]=0; return (i+1); } } return -1; }
static int timed_connect(int sock, const struct sockaddr *addr, socklen_t len) { int ret, value; socklen_t value_len; struct pollfd pfd[1]; PFUNC(); pfd[0].fd = sock; pfd[0].events = POLLOUT; fcntl(sock, F_SETFL, O_NONBLOCK); ret = true_connect(sock, addr, len); PDEBUG("\nconnect ret=%d\n", ret); if(ret == -1 && errno == EINPROGRESS) { ret = poll_retry(pfd, 1, tcp_connect_time_out); PDEBUG("\npoll ret=%d\n", ret); if(ret == 1) { value_len = sizeof(socklen_t); getsockopt(sock, SOL_SOCKET, SO_ERROR, &value, &value_len); PDEBUG("\nvalue=%d\n", value); if(!value) ret = 0; else ret = -1; } else { ret = -1; } } else { #ifdef DEBUG if(ret == -1) perror("true_connect"); #endif if(ret != 0) ret = -1; } fcntl(sock, F_SETFL, !O_NONBLOCK); return ret; }