标签:
1、写函数write
函数原型:
size_t write(int fd,const void *buf,size_t nbytes);
write函数将buf中的nbytes字节内容写入文件描述符fd,成功时返回写的字节数,失败时返回-1。在网络程序中,向套接字文件描述符写时有两种情况:
1)write的返回值大于0,表示写了部分或者是全部数据。
2)返回值小于0,此时出现了错误,要根据错误类型来处理。如果错误为EINTR,表示写的时候出现了中断错误;如果为EPIPE表示网络连接出现了问题(对方关闭了连接)。
可以自定义写函数来处理上面的情况:
int my_write(int fd, void *buffer, int length) { int bytes_left; int written_bytes; char *ptr; ptr = buffer; bytes_left = length; while (bytes_left>0) { /* 开始写*/ written_bytes = write(fd, ptr, bytes_left); if (written_bytes <= 0) /* 出错了*/ { if (errno == EINTR) /* 中断错误 我们继续写*/ written_bytes = 0; else /* 其他错误 没有办法,只好撤退了*/ return(-1); } bytes_left -= written_bytes; ptr += written_bytes; /* 从剩下的地方继续写 */ } return(0); }
2、读函数read
函数原型:
size_t read(int fd,void *buf,size_t nbytes);
read函数是负责从fd中读取内容。当读成功时,read返回实际所读的字节数。如果返回的值是0 表示已经读到文件的结束了;小于0表示出现了错误:如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。
可以自定义读函数来处理上面的情况:
int my_read(int fd, void *buffer, int length) { int bytes_left; int bytes_read; char *ptr; bytes_left = length; while (bytes_left>0) { bytes_read = read(fd, ptr, bytes_read); if (bytes_read<0) { if (errno == EINTR) bytes_read = 0; else return(-1); } else if (bytes_read == 0) break; bytes_left -= bytes_read; ptr += bytes_read; } return(length - bytes_left); }
标签:
原文地址:http://www.cnblogs.com/tgycoder/p/5251155.html