我正在开发一个TCP连接的程序,它由一个服务器和多个客户端组成。
服务器端
write(sockFd,message,strlen(message));
write(sockFd,message2,strlen(message2));
客户端
char msg[256];
bzero(msg, 256);
n = read (listenFd, msg, 255);
cout << "Msg1 " << msg << endl;
bzero(msg, 256);
n = read (listenFd, msg, 255);
cout << "Msg2 " << msg << endl;
问题是在服务器 write() 两条消息之后,客户端上的第一个 read() 可能会从服务器读取所有消息。 例如,输出为 Msg 1 content-of-msg1content-of-msg2。为什么会发生?
最佳答案
TCP 是一种流协议(protocol),因此数据以流的形式出现,这意味着每次读取都将读取与缓冲区中一样多的数据(或您请求的一样多)。
因此,如果您想将数据分解为数据包或数据报,则需要使用您自己的基于 session 的协议(protocol)。一种方法是在传出数据前加上 4 个字节的长度。这样读者可以首先读取长度,然后知道数据报的其余部分有多大。
关于服务器端的 C++ TCP 套接字多次写入()在客户端被视为单次读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33962466/