【发布时间】:2014-12-05 22:39:54
【问题描述】:
我正在使用 Qt 构建一个网络项目。我的项目以数据包的形式发送文件,每个数据包大小为 1K,我使用的是UDP 协议。
问题是当我尝试发送以兆字节为单位的大文件时,函数writeDatagram() 挂起,for loop 停止(我感觉)。
我该如何解决?这是我用于发送数据包的代码。数据包存储在向量中。
for(int i=0;i<vector.size();i++)
{
char *pkt=(char*)&vector.at(i);
MsgPacket *p=(MsgPacket*)&vector.at(i);
UDPSocket->writeDatagram(pkt,sizeof(*p),(*addr),(*port));
UDPSocket->waitForBytesWritten();
qDebug()<<"packet"<<i<<"sent";
}
【问题讨论】:
-
vector的类型是什么?请告诉我这不是vector<char>。为什么你不能只说sizeof(MsgPacket),而不是为了调整它的大小而创建一个完整的变量?为什么要将 >1MB 的消息复制到数据包向量中并发送这些数据包,而不是以零拷贝方式执行此操作?你为什么要一个一个地喂包然后等待? -
我所做的是:例如,我打开一个大小为 1 MB 的文件,然后将其划分为每个大小为 1 KB 的数据包,并将这些数据包存储在
vector类型为 @987654329 @(我之前定义的表示数据包的结构)。我将向量条目的类型转换为char以通过writeDatagram()发送它 - 显示文档 - 。 -
这个概念的问题在于,如果我们谈论的是多 MB 文件,那么您只是在 std 中制作了原始文件的第二个多 MB 副本(甚至没有效率) :: 数千个数据包的向量(为它们的分配付出代价),您将在发送它们后立即丢弃它们。你不能从加载这个向量的同一个循环中发送吗?你的电话可以更好地表达为
UDPSocket->writeDatagram(pkt, sizeof(MsgPacket), (*addr), (*port));,并删除MsgPacket *p这一行。 -
你为什么不把它放到一个单独的线程中或者在这里阻塞有什么问题?此外,请也向我们展示接收方代码,我的意思比您向发送方展示的更多。代码量不足。