服务器端的 C++ TCP 套接字多次写入()在客户端被视为单次读取

标签 c++ sockets tcp

我正在开发一个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/

相关文章:

java - JNA 和结构体数组作为参数

java - 配置为监听端口 8080 的 Tomcat 连接器启动失败

c++ - C++ 类运算符的 Doxygen 外联文档

c++ - 在 Xcode 和 Eclipse 中输出 char 数组

java - 等待客户端读取消息的套接字服务器

android - 从网络摄像机 (Hi3518) 获取警报/事件

c - nodejs从C接收到的buffer分为两部分

android - 监听器中的PrintWriter使应用程序崩溃

C++ Singleton类创建多个实例

c++ - 带有 list<..> 的结构在 2 dim 中。删除时的动态数组段错误