在 C++ 中使用套接字 io 获取动态字节数

Use socket io in C++ for dynamic number of bytes

我正在尝试实现一个简单的客户端-服务器应用程序,其中客户端或服务器可以在单个 write() 调用中发送动态字节数。

例如,我们假设客户端发送一个1500字节的字节流。服务器每 1000 个字节读取一次。

int BUFFER_SIZE = 1000;
...
read( iSockFD, cBuffer, BUFFER_SIZE );

我可以使用循环并调用 read,直到它的 return 值为 0。但是客户端可能有多个 write() 循环调用(即发送多条消息)。

我的问题是,它会影响服务器端的read()吗?意思是,客户端中两个连续的 1000 字节 write() 是否会被服务器端缓冲区大小为 2000 字节的单个 read() 读取?

如果是这样的话,推荐的实施这种情况的方法是什么?我应该为消息使用分隔符(使用编码算法)吗?

我理解这与套接字本身更相关,而不是 C++。但是,非常感谢您的帮助和指导。

更新:

目的是实现一个简单的中间件系统来发送不同类型的消息,其中消息在发送前将以二进制编码。

没有人能保证写入(x) 会在接收端触发读取(x)。如果 x 大于您的套接字接收缓冲区,或者如果您在套接字接收缓冲区中接收到整个消息之前调用 read(),则 read() 将仅 return 一小部分数据并要求您发出后续的 read() 以获得其余部分。

推荐的方法是定义一个足够大的消息缓冲区。每次调用 read() 都会 return 1 个或多个字节,您将这些字节排入缓冲区。现在,一旦缓冲区大于 4 个字节 + 存储在缓冲区前 4 个字节中的 be32toh(integer),您必须从缓冲区开始使用整数加上以下 x 个字节(并进一步处理它们)。这将使您能够很好地处理 read() 包含先前未完成的数据包的结尾,同时包含下一个(未完成的)数据包的开头的情况。

只需确保您传输的每个有效负载都带有 htobe32(长度)前缀。