【问题标题】:Sending packets with UDP protocol使用 UDP 协议发送数据包
【发布时间】: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&lt;char&gt;。为什么你不能只说sizeof(MsgPacket),而不是为了调整它的大小而创建一个完整的变量?为什么要将 >1MB 的消息复制到数据包向量中并发送这些数据包,而不是以零拷贝方式执行此操作?你为什么要一个一个地喂包然后等待?
  • 我所做的是:例如,我打开一个大小为 1 MB 的文件,然后将其划分为每个大小为 1 KB 的数据包,并将这些数据包存储在 vector 类型为 @987654329 @(我之前定义的表示数据包的结构)。我将向量条目的类型转换为 char 以通过 writeDatagram() 发送它 - 显示文档 - 。
  • 这个概念的问题在于,如果我们谈论的是多 MB 文件,那么您只是在 std 中制作了原始文件的第二个多 MB 副本(甚至没有效率) :: 数千个数据包的向量(为它们的分配付出代价),您将在发送它们后立即丢弃它们。你不能从加载这个向量的同一个循环中发送吗?你的电话可以更好地表达为UDPSocket-&gt;writeDatagram(pkt, sizeof(MsgPacket), (*addr), (*port));,并删除MsgPacket *p这一行。
  • 你为什么不把它放到一个单独的线程中或者在这里阻塞有什么问题?此外,请也向我们展示接收方代码,我的意思比您向发送方展示的更多。代码量不足。

标签: c++ qt udp qtnetwork


【解决方案1】:

您对UDPSocket-&gt;waitForBytesWritten(); 的调用使您的循环等待直到刷新套接字。要么不调用UDPSocket-&gt;waitForBytesWritten();,要么将此例程放在单独的线程中,这样它就不会阻塞。

引用waitForBytesWritten()的文档:

这个函数可以在没有事件循环的情况下运行。它在编写非 GUI 应用程序以及在非 GUI 线程中执行 I/O 操作时很有用。

【讨论】:

  • 我删除了它,但问题仍然存在,我尝试发送大小为 250 k 的文件。如果一切正常,将收到 250 个数据包,但实际情况是,收到了 67 个数据包。
猜你喜欢
  • 2014-08-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 2016-10-26
相关资源
最近更新 更多