鉴于TCP之简单回传(一) 中所出现的问题,本博文所要采取的一种方法是:
服务器端和客户端共同遵守如下约定:
接收的字节流中,若遇到'
',表示一次传送完毕。
具体为:
客户端把每次欲发送的数据的最后一个字符设置为 ' ';
而服务器每次接收时,一个一个字符的从缓冲区中取出一个字符,然后再判断该字符是否为' ',若不是,则继续读取;若是,则退出循环,表示本次接收结束;
实现代码如下:
//按字符读取--->由于每读取一个字符就产生一次系统调用,故效率较低 ssize_t readline_slow(int fd, void *usrbuf, size_t maxlen) { char *bufp = (char*)usrbuf;//偏移位置 ssize_t nread; size_t nleft = maxlen -1 ;//剩余字节数 char ch;//保存每次读取的字符 while( nleft > 0)//只要还有没读的,就一直循环 { if(-1 == (nread=read(fd, &ch, 1)))//把从fd中读取的字符存进ch中 { if(errno == EINTR)//被中断信号打断 continue; return -1;//err }else if(0 == nread ) break; //EOF *bufp = ch;//将读取的字符存进buf bufp++;//向前移动 nleft --;//剩余字节数-- if(ch == ' ')//如果该字符为 。本次读取完成 break; } *bufp ='