UNP读书笔记第三章

网络字节序和主机字节序大小端不一样。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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值