网络字节序和主机字节序大小端不一样。linux提供了4个转换函数;
#include <netinet/in.h>
uint16_t htons(uint16_t value);
uint32_t htonl(uint_32t value);
uint16_t ntohs(uin16_t value);
uint32_t ntohl(uin32_t value);
ip地址可分为表达 和 数值 用这两个函数转换 ,IPV4 IPV6 通用
int inet_pton(int family, const char *strptr,void *addrptr);
const char* inet_ntop(int family, const void *addrptr,char *strptr,size_t len);
readn writen readline 函数
#include <unistd.h>
#include <errno.h>
int readn(int fd, void *vptr, int n)
{
int nleft = n, nread = 0;
char * p = vptr;
while(nleft > 0){
if( (nread = read(fd, p ,n)) < 0){
if(errno == EINTR)
nread = 0;
else
return -1;
}else if( nread == 0)
break;
nleft -= nread;
p += nread;
}
return (n-nleft);
}
int writen(int fd,const void *vptr,int n)
{
int nleft = n,nwrite = 0;
const char *ptr = vptr;
while(nleft > 0){
if((nwrite = write(fd,ptr,nleft)) <= 0){
if(nwrite < 0 && errno == EINTR)
nwrite = 0;
else
return -1;
}
nleft -= nwrite;
ptr += nwrite;
}
return n;
}
#include <unistd.h>
#include <errno.h>
int readline(int fd, void *vptr, int maxlen)
{
int readc, n;
char c, *ptr = vptr;
for(n = 1; n < maxlen; n++){
if( (readc = read(fd, &c, 1)) == 1){
*ptr++ = c;
if( c == '\n')
break;
}else if( readc == 0){
*ptr = 0;
return (n - 1);
}else{
if(errno == EINTR)
n--;
else
return -1;
}
}
*ptr = 0;
return n;
}
三个函数都查找ENTIR错误,表示被系统信号中断。
readline 快速版本
/*
*readline.cpp中的readline版本及其缓慢,因为每读一个数据就调用一次系统调用
*改用标准I/O数据库(stdio)相当诱人,但是这是非常危险的,stdio的缓冲区不可见
*这个版本增加了自己的缓冲区,提高性能
*但是这个函数是不可重入或者说线程不安全的
*/
#include <unistd.h>
#include <errno.h>
static int read_count;
static char *read_ptr;
static char read_buff[1024];
static int my_read(int fd, void *ptr)
{
while( read_count <= 0){
if( (read_count = read(fd, read_buff, sizeof(read_buff))) < 0){
if(errno == EINTR)
continue;
return -1;
}else if(read_count == 0)
return 0;
read_ptr = read_buff;
break;
}
read_count--;
*ptr = *read_buff++;
return 1;
}
int readline_quick(int fd, void *vptr, int maxlen)
{
int readc, n;
char c, *ptr = vptr;
for(n = 1; n < maxlen; n ++){
if( (readc =my_read(fd, &c)) == 1){
*ptr++ = c;
if( c == '\n')
break;
}else if( readc == 0){
*ptr = 0;
return (n - 1);
}else{
if(errno == EINTR)
n--;
else
return -1;
}
}
*ptr = 0;
return n;
}