Unix网络编程之readline函数
来源:互联网 发布:网络出租屋转让 编辑:程序博客网 时间:2024/06/05 19:20
1.为什么要使用readline函数?首先我们先考虑一下网络字节流传递消息的时候的黏包问题,我们之前的解决办法是将存放消息的buf定义成一个结构体,里面有一个len成员用来记录下一次我要发送多少个字节的消息。我们可以再想一种方法,我们把消息之间用一个标识符隔开,这样每个包之间就可以分离开来。比如我们可以像ftp那样用一个‘\r\t‘隔开。
2.使用readline需要注意的地方:首先我们先用recv函数将套接字里面的消息先偷出来,所谓偷,就是直接复制过来,而不像read函数那样直接把消息剪切过来。先复制过来看看有没有’\n‘字符,如果没有的话就得readn进来。如果有的的话就直接读到缓冲区就可以了。
代码:
ssize_t readline(int fd,void *buf,size_t len ){ ssize_t ret; ssize_t nread = 0; size_t nleft = len; char * ptr = buf; while(1){ ret = recv(fd,ptr,nleft,MSG_PEEK); //recv函数将套接字里面的消息拷贝出来,它并不是将消息剪切过来。 if(ret < 0) ERR_EXIT("readn by recv"); if(ret == 0 ){ printf("close the socket"); break; } int i; for(i=0;i<ret;i++){ //写一个for循环,看看刚刚偷窥过来的消息有没有'\n'。 if(ptr[i] == '\n') { readn(fd,ptr,i+1); //如果有'\n'那就直接readn到缓冲区里面就可以了。 nread += i+1; return nread; } } readn(fd,ptr,ret); //如果没有'\n',那就直接readn到缓冲区,再进行下一次拷贝和检测。 nleft -= ret; //不要忘了将nleft和ptr和nread更新。 ptr += ret; nread += ret; } return nread;}
0 0
- Unix网络编程之readline函数
- unix网络编程readn,writen,readline包裹函数
- 《unix网络编程》中readline函数改进版
- unix 网络编程 readn writen readline
- UNIX网络编程——利用recv和readn函数实现readline函数
- 《UNIX网络编程 卷1》 笔记: readline函数 (不可重入版本)
- 《UNIX网络编程 卷1》 笔记: readline函数 (可重入版本)
- UNIX网络编程之常用函数
- linux网络编程之socket(六):利用recv和readn函数实现readline函数
- linux网络编程之socket(六):利用recv和readn函数实现readline函数
- linux网络编程之socket(六):利用recv和readn函数实现readline函数
- linux网络编程之socket(六):利用recv和readn函数实现readline函数
- linux网络编程之socket(六):利用recv和readn函数实现readline函数
- Unix 网络编程 函数
- unix 网络编程常用函数
- Unix网络编程 gethostbyname函数
- Unix网络编程相关函数
- Unix网络编程基本函数
- Jetty实战之嵌入式Jetty集成Spring运行
- JSON 在 WinCE 下的使用(1)
- KNN算法实战——手写数字识别
- hdu1241 Oil Deposits dfs水题 TWT Tokyo Olympic 2combo-3
- JNI官方规范中文版——如何访问Java中的字段和方法
- Unix网络编程之readline函数
- c语言函数名
- SSH原理与应用
- spark2.0 英文翻译 Spark Programming Guide
- char_dev
- JNI官方规范中文版——如何使用JNI中的global reference和local reference
- telephony-1(ril模块)
- 华为编码规范之 注释规范
- 1101. Quick Sort