gpt4 book ai didi

c++ - 在 Qt 中通过 TCP 传输大文件

转载 作者:可可西里 更新时间:2023-11-01 02:33:59 26 4
gpt4 key购买 nike

我是通过套接字传输 TCP 文件的新手。因此,就 self 学习而言,我想修改示例“Loopback”,使其在建立连接后从服务器向客户端发送一个大文件(例如 100Mb 到 2Gb)。我的问题是我不知道如何拆分文件以便现在传输必须完成。让我插入一段代码以使其更易于理解:

server.cpp

void Dialog::acceptConnection()
{
tcpServerConnection = tcpServer.nextPendingConnection();
connect(tcpServerConnection,SIGNAL(connected()), this, SLOT(startTransfer()));
connect(tcpServerConnection, SIGNAL(bytesWritten(qint64)), this, SLOT(updateServerProgress(qint64)));
connect(tcpServerConnection, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));

serverStatusLabel->setText(tr("Accepted connection"));
startTransfer();
}
void Dialog::startTransfer()
{
file = new QFile("file_path");
if (!file->open(QIODevice::ReadOnly))
{
serverStatusLabel->setText("Couldn't open the file");
return;
}
int TotalBytes = file->size();

bytesToWrite = TotalBytes - (int)tcpServerConnection->write(<-WHAT HERE!!!->));
serverStatusLabel->setText(tr("Connected"));
}
void Dialog::updateServerProgress(qint64 numBytes)
{
bytesWritten += (int)numBytes;

// only write more if not finished and when the Qt write buffer is below a certain size.
if (bytesToWrite > 0 && tcpServerConnection->bytesToWrite() <= 4*PayloadSize)
bytesToWrite -= (int)tcpServerConnection->write(<-WHAT HERE!!!->));

serverProgressBar->setMaximum(TotalBytes);
serverProgressBar->setValue(bytesWritten);
serverStatusLabel->setText(tr("Sent %1MB").arg(bytesWritten / (1024 * 1024)));
}

我见过一些使用 readAll() 的解决方案,但我认为 qt 无法处理内部有 2Gb 数据的缓冲区...因此,如前所述,我的问题是如何通过覆盖 tcpServerConnection 将文件转移到?我想知道是否建议为此目的使用 QDataStream(QDataStream out(&file, QIODevice::WriteOnly);)。

谢谢!

PD:注意代码上的标记 <-WHAT HERE!!!->

最佳答案

好的,感谢 Basile Starynkevitch 我找到了解决方案。就像设置一样简单:

buffer = file->read(PayloadSize);

然后通过Tcp发送。在本地网络中,我在 40.11 秒内传输了 397Mb。谢谢,

关于c++ - 在 Qt 中通过 TCP 传输大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27065463/

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