gpt4 book ai didi

c++ - 在消息前加上消息的大小

转载 作者:行者123 更新时间:2023-11-28 06:46:05 25 4
gpt4 key购买 nike

我正在写一些服务器-客户端相关的东西,这里有这段代码:

char serverReceiveBuf[65536];
client->read(serverReceiveBuf, client->bytesAvailable());
handleConnection(serverReceiveBuf);

每当服务器发出 readyRead() 信号时读取数据。当我在本地网络上测试时使用 bytesAvailable() 很好,因为没有延迟,但是当我部署程序时,我想确保在我 handleConnection().

我正在想办法做到这一点,但是 readwrite 只接受字符,所以我可以在一个字符中发送的最大消息大小指示符是 127。我希望最大大小为 65536,但我能想到的唯一方法是首先使用 size-of-size-of-message 变量。

我重新编写了代码,使其看起来像这样:

char serverReceiveBuf[65536];
char messageSizeBuffer[512];
int messageSize = 0, i = 0; //max value of messageSize = 65536
client->read(messageSizeBuffer,512);
while((int)messageSizeBuffer[i] != 0 || i <= 512){
messageSize += (int) messageSizeBuffer[i];
//client will always send 512 bytes for size of message size
//if message size < 512 bytes, rest of buffer will be 0
}
client->read(serverReceiveBuf, messageSize);
handleConnection(serverReceiveBuf);

但如果存在的话,我想要一个更优雅的解决方案。

最佳答案

在通过流发送消息时,在消息有效负载之前发送固定大小的 header 是一种非常常见的技术。此 header 可以包含许多不同的信息,但它始终包含有效负载大小。在最简单的情况下,您可以发送编码为 uint16_t 的消息大小,最大负载大小为 65535(或者 uint32_t,如果这还不够)。只需确保使用 ntohshtons 处理字节顺序即可。

uint16_t messageSize;
client->read((char*)&messageSize, sizeof(uint16_t));
messageSize = ntohs(messageSize);
client->read(serverReceiveBuf, messageSize);
handleConnection(serverReceiveBuf);

关于c++ - 在消息前加上消息的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24961149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com