关键词:
【中文标题】使用 UDP 协议发送数据包【英文标题】:Sending packets with UDP protocol 【发布时间】: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
这一行。
你为什么不把它放到一个单独的线程中或者在这里阻塞有什么问题?此外,请也向我们展示接收方代码,我的意思比您向发送方展示的更多。代码量不足。
【参考方案1】:
您对UDPSocket->waitForBytesWritten();
的调用使您的循环等待直到刷新套接字。要么不调用UDPSocket->waitForBytesWritten();
,要么将此例程放在单独的线程中,这样它就不会阻塞。
引用waitForBytesWritten()
的文档:
这个函数可以在没有事件循环的情况下运行。它在编写非 GUI 应用程序以及在非 GUI 线程中执行 I/O 操作时很有用。
【讨论】:
我删除了它,但问题仍然存在,我尝试发送大小为 250 k 的文件。如果一切正常,将收到 250 个数据包,但实际情况是,收到了 67 个数据包。udp协议(代码片段)
...在收到数据时,也不会向发送端反馈是否收到数据。由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接... 查看详情
linux内核网络udp数据包发送——udp协议层分析(代码片段)
1.前言本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调优。2. udp_sendmsg这个函数定义在net/ipv4/udp.c,函数很长... 查看详情
linux内核网络udp数据包发送——udp协议层分析(代码片段)
1.前言本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调优。2. udp_sendmsg这个函数定义在net/ipv4/udp.c,函数很长... 查看详情
qq协议0825和0836udp登录包解析(代码片段)
qq协议0825和0836udp登录包解析参考使用工具:概念解释udp报文解析0825udp发送包报文原始数据:解析0825返回包原始数据解析0836发送包原始数据解析参考0825包参考:https://www.cnblogs.com/mRRRR/p/5288931.html虽然是2016年的,但是里面的结构大体还... 查看详情
第2章udp协议(代码片段)
...在收到数据时,也不会向发送端反馈是否收到数据。由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接... 查看详情
udp的意思是啥udp与tcp的区别
...进行数据包的发送和接收,设计用户数据报协议UDP。 使用UDP协议包括:TFTP、SNMP、NFS、DNS、BOOTP。 UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接数据包传输服务。它不提供报文到达确认、排序、及流... 查看详情
如何实现可靠的 UDP 协议?
...您的UDP消息被发送和接收,但是您可以在您的应用程序中使用确认消息来查看您是 查看详情
udp通讯协议
...传输数据时,不管对端服务是否启动,直接发送。日常中使用Udp技术的软件有:飞秋、视频会议等; TCP:- 查看详情
linux内核网络udp数据包发送——linuxnetdevice子系统(代码片段)
...;一)Linux内核网络UDP数据包发送(二)——UDP协议层分析Linux内核网络UDP数据包发送(三)——IP协议层分析1.前言在继续分析 dev_queue_xmit 发送数据包之前,我们需要了解以下重要概念 查看详情
linux内核网络udp数据包发送——linuxnetdevice子系统(代码片段)
...;一)Linux内核网络UDP数据包发送(二)——UDP协议层分析Linux内核网络UDP数据包发送(三)——IP协议层分析1.前言在继续分析 dev_queue_xmit 发送数据包之前,我们需要了解以下重要概念 查看详情
UDP数据包字节读取粒度?
...协议包”不超过MTU大小,预计不会出现碎片。目前我正在使用ASIO库并遇到一些问题:时间图:客户端发送报头(2字节)和有效载荷(N服务器只读取2个 查看详情
linux内核网络udp数据包发送——ip协议层分析(代码片段)
1.前言Linux内核网络UDP协议层通过调用 ip_send_skb 将skb交给IP协议层,本文通过分析内核IP协议层的关键函数来分享内核数据包发送在IP协议层的处理,并分享了监控IP层的方法。2. ip_send_skbip_send_skb 函数定义在net/ipv4/ip_outp... 查看详情
linux内核网络udp数据包发送——ip协议层分析(代码片段)
1.前言Linux内核网络UDP协议层通过调用 ip_send_skb 将skb交给IP协议层,本文通过分析内核IP协议层的关键函数来分享内核数据包发送在IP协议层的处理,并分享了监控IP层的方法。2. ip_send_skbip_send_skb 函数定义在net/ipv4/ip_outp... 查看详情
局域网中一个udp包可以装多少数据?
参考技术A使用UDP协议在局域网中一次传输最多能传多少数据?****以太网数据帧的最大长度为1500字节,即IP数据报文的长度,即数据链路层的MTU(最大传输单元)****下图为IP数据报的详细格式:可以看到,报头区占据32*5=160bits(不... 查看详情
udp协议的用途
udp的具体用途有哪些。哪些软件使用的是UDP协议,能否举些例子1、UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。常用的UDP端口号有:53(DNS)、69(TFTP)、... 查看详情
为啥在局域网中使用udp比tcp好?请说明详细的具体的原因
有一个局域网中使用的文字聊天工具,他用的是UDP和IP协议,我想知道为什么没有使用TCP协议?这样能保证数据的有效到达吗?还是因为在局域网中数据的传输本来就是肯以信任的,很少丢包?UDP协议无需握手,速度快,消耗少... 查看详情
udp与tcp协议
...在收到数据时,也不会向发送端反馈是否收到数据。由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接... 查看详情
java网络编程udp协议之发送数据和接收数据的详解(代码片段)
...到数据时,也不会向发送端反馈是否收到数据。由于使用UDP协议消耗资源少,通信效率高,所以通常都会用于音频,视频和普通数据的传输。例如视频会议通常会采用UDP协议,因为这种情况偶尔丢一两个数据... 查看详情