gpt4 book ai didi

c++ - 如何将超过 65536 字节的二进制数据编码为 C++ 上的 websocket 帧

转载 作者:行者123 更新时间:2023-11-30 05:13:51 24 4
gpt4 key购买 nike

我的服务器在 std::string 缓冲区 (ANSI) 中保存 jpeg 文件。我需要根据要求将其发送给网络客户端。接下来我尝试了:

std::string ws_encode(std::string frame) {
string result;
result.resize(2);
result[0]= 130;
if (frame.size() <= 125) {result[1]=frame.size();}
else if (frame.size() >= 126 && frame.size() <= 65535) {
result.resize(4);
result[1] = 126;
result[2] = ( frame.size() >> 8 ) && 255;
result[3] = ( frame.size() ) && 255;
}
else {
result.resize(10);
result[1] = 127;
result[2] = ( frame.size() >> 56 ) && 255;
result[3] = ( frame.size() >> 48 ) && 255;
result[4] = ( frame.size() >> 40 ) && 255;
result[5] = ( frame.size() >> 32 ) && 255;
result[6] = ( frame.size() >> 24 ) && 255;
result[7] = ( frame.size() >> 16 ) && 255;
result[8] = ( frame.size() >> 8 ) && 255;
result[9] = ( frame.size() ) && 255;
}
return result+frame;
}

然后:

string encoded_frame = ws_encode(Agents["65535"].Screen); // it's a map <string id, struct Agent>, Agent has string Screen buffer for screenshots
send(client_socket, &encoded_frame[0], encoded_frame.size(), 0);

但是浏览器在控制台中没有任何解释就关闭了连接。也许长度计算错误,或者并非所有数据都已发送...我不知道 - 在发送之前用编码数据编写 test.txt 看起来是正确的。

有人可以帮我完成这个任务吗?

最佳答案

当设置有效负载长度值的字节时,您使用的是 LOGICAL AND (&&) 运算符,而您应该使用 BITWISE AND (&) 运算符。

尝试更像这样的东西:

std::string ws_encode(char opcode, const std::string &data)
{
string result;
std::string::size_type size = data.size();

if (size <= 125)
{
result.resize(2+size);
result[0] = 0x80 | opcode;
result[1] = (char) size;
}
else if (size <= 65535)
{
result.resize(4+size);
result[0] = 0x80 | opcode;
result[1] = 126;
result[2] = (size >> 8) & 0xFF;
result[3] = (size ) & 0xFF;
}
else
{
result.resize(10+size);
result[0] = 0x80 | opcode;
result[1] = 127;
result[2] = (size >> 56) & 0xFF;
result[3] = (size >> 48) & 0xFF;
result[4] = (size >> 40) & 0xFF;
result[5] = (size >> 32) & 0xFF;
result[6] = (size >> 24) & 0xFF;
result[7] = (size >> 16) & 0xFF;
result[8] = (size >> 8) & 0xFF;
result[9] = (size ) & 0xFF;
}

if (size > 0)
{
memcpy(&result[result.size()-size], data.c_str(), size);
// or:
// std::copy(data.begin(), data.end(), result.begin()+(result.size()-size));
}

return result;
}

std::string encoded_frame = ws_encode(0x02, Agents["65535"].Screen);
send(client_socket, encoded_frame.c_str(), encoded_frame.size(), 0);

关于c++ - 如何将超过 65536 字节的二进制数据编码为 C++ 上的 websocket 帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43715746/

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