gpt4 book ai didi

c++ - 通过 QDataStream 从客户端发送到服务器的字节不匹配

转载 作者:行者123 更新时间:2023-11-30 03:23:19 25 4
gpt4 key购买 nike

我正在尝试在 QTcpSocket 上发送一个 QByteArray 。我面临的问题是,虽然我发送了一个长度为 25 的数组,但在服务器上它收到了 59 个字节。这是我的示例代码:

//client
QDataStream out(qctcpSocket);
out<<qByteArray; // qByteArray is of length 25
const int nbBytes = qctcpSocket->write(qByteArray); // nbBytes returbs 25

//server
TArray<char> data;
uint32 pendingData = 0;
TArray<char> newData; // customized Template for Array
newData.InsertZeroed(0, pendingData);
int32 bytesRead = 0;
rcvSocket->Recv(reinterpret_cast<uint8*>(newData.GetData()), pendingData, bytesRead);
data += newData;//length is 59 !!

最佳答案

我在您的客户端代码中发现了两个问题。由于您使用(假设)连接的套接字作为数据流底层设备:

QDataStream out(qctcpSocket);

你正在通过套接字发送数据,使用这一行:

out<<qByteArray;  // qByteArray is of length 25

那么您将在下一个数据中发送更多数据:

const int nbBytes = qctcpSocket->write(qByteArray); // nbBytes returbs 25 

这是第一个问题:您正在尝试发送相同的数据两次。但是每次调用之间的数据不同(这是第二个问题):执行第一次发送,使用流,将在套接字上放置一个字节长的数组QByteArray::size + 4,四个流对象添加的额外字节(它是实际字节数组之前的大端 32 位整数,并以字节为单位保存其长度)。

相反,第二次发送仅将字节数组中的 25 个字节放在套接字上,我想这正是您首先想要的。

我的建议是完全摆脱数据流并使用 QTcpSocket 类的 write 方法,如果您不这样做,这应该是最好的选择在另一个端点(服务器)上使用 Qt。

如果你仍然想使用流,去掉发送端的write,并确保在接收端使用QDataStream对象,所以你必须:

//Build a QByteArray out of the incoming bytes:
QByteArray raw_data = ...

//Use it as the stream device
QDataStream stream(raw_data);

//Use another byte array to fetch the data out of the stream
QByteArray data;
stream >> data;

或者您可以手动去除前四个字节,我真的不推荐这样做。

关于c++ - 通过 QDataStream 从客户端发送到服务器的字节不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50443678/

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