使用UDP协议发送数据包

问题描述:

我正在使用Qt构建网络项目。我的项目发送文件作为数据包,每个数据包是1K大小,我使用UDP协议。使用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"; 
} 
+1

'vector'的类型是什么?请告诉我这不是'矢量'。为什么不能直接说'sizeof(MsgPacket)',而不是为了调整它而创建一个完整的变量呢?你为什么要将1MB以上的消息复制到一个数据包中并发送这些消息,而不是以零拷贝的方式来做这件事?你为什么一个接一个地喂食信息包并等待? – 2014-12-05 22:59:22

+1

我做的是:我打开一个大小为1 MB的文件,然后我将它分成大小为1 KB的数据包,并将这些数据包存储在类型为'Msgpacket'的'vector'中(我定义的结构以前代表一个数据包)。我将这些向量条目的类型转换为'char',通过'writeDatagram()'发送 - 显示文档 - 。 – suhayb 2014-12-06 07:00:49

+0

这个概念的问题是,如果我们正在谈论多MB文件,那么您刚刚在原始文件的第二个多MB副本中(甚至没有效率)在_multiple数千的std :: vector中创建packets_(支付他们的分配的价格),你将在发送它们之后立即丢弃它们。你能不能从加载这个向量的同一个循环中发送数据?你的调用可以更好地表达为'UDPSocket-> writeDatagram(pkt,sizeof(MsgPacket),(* addr),(* port));'并通过删除'MsgPacket * p'行。 – 2014-12-06 07:16:16

您致电UDPSocket->waitForBytesWritten();会使您的循环等待,直到套接字刷新。要么不要调用UDPSocket->waitForBytesWritten();,要么将这个例程放在一个单独的线程中,所以它不会阻塞。

引用的文档的用于waitForBytesWritten()

该函数可以在没有事件循环操作。在编写非GUI应用程序时以及在非GUI线程中执行I/O操作时非常有用。

+0

我删除它,但问题仍然存在, 和我试图发送大小为250 k的文件。 如果每件事情都按照它应该的方式工作,将会收到250个数据包,但实际发生的是67个数据包收到。 – suhayb 2014-12-06 06:46:21