【发布时间】:2012-11-24 15:51:43
【问题描述】:
我制作了一个简单的 tcp 服务器/客户端应用程序,客户端向服务器写入一些内容,然后将其回显给客户端。但是,当我尝试读取服务器在客户端中回显的内容时遇到了一些问题。
string s;
while((n = read(socketFD[0],readBuf, BUFFER_SIZE)) > 0){
cout<<"\nBytes read: "<<n<<endl;
s.append(readBuf, n);
}
cout<<"\nTest after read\n";
我将 16 KB 的文本写入服务器。当我在客户端读取时,我一次读取 4 KB。
这段代码的输出是:
Bytes read: 4096
Bytes read: 4096
Bytes read: 4096
Bytes read: 4046
读取调用似乎在从套接字读取完成后阻塞并且永远不会离开循环。我该如何解决这个问题?
编辑:这是服务器中处理连接客户端的代码。
if((childpid = fork()) == 0){
close(listenFD);
while ((n = read(connectFD, buf, BUFFSIZE)) > 0){
cout<<"\nBytes read: "<<n<<endl;
write(connectFD, buf, n);
}
cout<<"\nTest after read\n";
exit(0);
}
这个输出是:
Bytes read: 4096
Bytes read: 4096
Bytes read: 4096
Bytes read: 4046
Test after read
与客户端中的代码相比,这里有什么不同?为什么读取调用不像在客户端那样阻塞?
【问题讨论】:
-
readArr是什么?当服务器关闭连接时,循环应该退出 --read()将返回 0 表示 EOF。 -
打错字了,应该是readBuf
-
那行不通,因为
readBuf不是 C++ 字符串或 C 字符串。 C 字符串需要以 null 结尾,而read不这样做,因为它可以用于非字符串的数据。