在 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(长度)前缀。
我正在尝试实现一个简单的客户端-服务器应用程序,其中客户端或服务器可以在单个 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(长度)前缀。