版权声明: https://blog.csdn.net/dashoumeixi/article/details/85111109
略
#define SA struct sockaddr
ssize_t readn(int fd , void *ptr, size_t n)
{
size_t left = n;
char * p = (char *)ptr;
int nread = 0;
while (left > 0){
if((nread = read(fd,p,left)) < 0){
if(errno == EINTR)
nread = 0;
else
return -1;
}
else if(nread == 0)
break;
left -= nread;
p += nread;
}
return n - left;
}
ssize_t writen(int fd , void * ptr , size_t n)
{
size_t left = n;
char * p = (char*)ptr;
int nwrite = 0;
while( left > 0){
if((nwrite = write(fd,p,left)) <= 0){
if(errno == EINTR && nwrite < 0)
nwrite = 0;
else
return -1;
}
left -= nwrite;
p += nwrite;
}
return n - left;
}
int conn_timeout(int sockfd , const struct sockaddr_in * sin, socklen_t socklen, int secs)
{
int old_flag = fcntl(sockfd,F_GETFL,0);
if( fcntl(sockfd,F_SETFL,old_flag|O_NONBLOCK) < 0){
perror("fcntl failed");
return -1;
}
int ret = 0;
if((ret = connect(sockfd,(SA*)&sin,socklen)) < 0){
if(errno != EINPROGRESS){
perror("connect error");
return -1;
}
}
if(0 == ret)
goto done;
fd_set rset,wset;
FD_ZERO(&rset);
FD_SET(sockfd,&rset);
wset = rset;
struct timeval timeout;
timeout.tv_sec= secs;
timeout.tv_usec = 0;
ret = select(sockfd+1,&rset,&wset,NULL,secs?&timeout:NULL);
if(ret < 0){
perror("select error");
return -1;
}
else if( 0 == ret){
close(sockfd);
return -1;
}
if(!(FD_ISSET(sockfd,&rset) || FD_ISSET(sockfd,&wset))){
return -1;
}
done:
fcntl(sockfd,F_SETFL,old_flag);
return 0;
}