1. 我做了什么
最近在学习如何用select函数实现echo server。期间遇到了一个关于缓冲区的问题,在这里分享给大家。
在使用read/recv, write/send类函数进行数据传输时,需要程序员手动创建缓冲区。通常(各种书籍中),大家都会将缓冲区的大小设置为1024或其整数倍。但是我在编写echo server时就遇到了一些问题。以下是echo server的图示。缓冲区大小是BUFFLEN=1024。
客户端这里write的长度是strlen(buffer),read的长度是BUFFLEN-1,这块我是参考《TCP/IP网络编程》这本书的。因为随后还有一个buffer[BUFFLEN] = ' ' 的操作,所以read的长度是BUFFLEN-1(为了凑成一个字符串)。(谁能知道就是这里出了问题)。同时,服务端这里write和read的长度都是BUFFLEN。
2. 出现了什么问题
事情是这样的,当我开心参考着书上的代码,在电脑上敲了一遍,一顿编译之后,发现只有第一次能够echo成功,后续客户端的输入并不能被有效的echo回客户端,如下图所示。
客户端:
服务端:
我们可以看到服务端这块的读写还是正常的,但是客户端在第二次的read中,仅仅读了1个字节。我查阅了书中相关的内容,发现我的服务端代码和书上稍有不同。
//服务端代码 char buffer[BUFFLEN]; memset(buffer, 0, BUFFLEN); int strlen = read(i, buffer, BUFFLEN); printf("server read: %s, [%d]bytes ", buffer, strlen); if (strlen == 0) { FD_CLR(i, &rdset); close(i); } else { //不同的地方: //int wlen = write(i, buffer, strlen); 原书的代码 int wlen = write(i, buffer, BUFFLEN); buffer[strlen] = '