gpt4 book ai didi

Qt 通过 TCP 发送文件

转载 作者:可可西里 更新时间:2023-11-01 02:35:14 24 4
gpt4 key购买 nike

我在单个应用程序中执行 TCP 文件客户端-服务器。

主要是,我每 50000 字节发送文件名和文件的和平。

客户:

void client::sendFile(QString path)
{
QDataStream out(cl);
QFile toSend(path);

if (toSend.open(QIODevice::ReadOnly))
{
int s = 0;

QFileInfo fileInfo(toSend.fileName());
QString fileName(fileInfo.fileName());
out << fileName;

while (!toSend.atEnd())
{
QByteArray rawFile;
rawFile = toSend.read(50000);
out << rawFile;
qDebug() << "ToSend"<<rawFile.size();
s+=rawFile.size();
}

qDebug() << "Total:" << s;
}
}

...我想这是正确的

服务器(ReadyRead槽):

void server::receive()
{
QTcpSocket *sender = (QTcpSocket*) this->sender();

QDataStream in(sender);

QString fName;
in >> fName;
QFile newFile("D:\\"+fName);

if (newFile.open(QIODevice::WriteOnly))
{
while(sender->bytesAvailable())
{
QByteArray z;
in >> z;
newFile.write(z);
qDebug () << "Received " << z.size();
}

newFile.close();
}
}

... 这是问题:while 在第一次迭代后损坏。

看:

ToSend 50000 
ToSend 50000
ToSend 50000
ToSend 31135
Total: 181135
Received 50000

如您所见,只收到了 1 个 block ,而不是 4 个。

如何解决这个问题?为什么 bytesAvailable 在不应该返回 0 的情况下返回 0?很高兴知道这种通过 tcp 接收文件的好方法是否也很好 :)

最佳答案

可能是因为只有这一包可用。在发送数据之前,您需要设置有关文件大小的协商。然后等待所有数据传输完毕。一旦处理完前 50k 数据,BytesAvailable() 就会返回 false。如果您再次调用 bytesAvailable() 等待 1 秒,您可能会收到另一个数据包。

在发送数据之前实现一个 4 字节的“大小数据包”并检查正在接收的那些字节。

所以你的协议(protocol)将是:

  • 数据包大小
  • 数据包
  • n次数据包

另一种选择是有一个预定义的结束数据包,但如果您的文件可以在原始数据中包含此数据包,这可能很危险。如果您可以确保您的数据不包含您的最终数据包,您最终会将协议(protocol)实现为:

  • 数据包
  • n次数据包
  • 结束数据包

关于Qt 通过 TCP 发送文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24138851/

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