使用 UDP 协议发送数据包

     2023-02-16     23

关键词:

【中文标题】使用 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&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这一行。 你为什么不把它放到一个单独的线程中或者在这里阻塞有什么问题?此外,请也向我们展示接收方代码,我的意思比您向发送方展示的更多。代码量不足。 【参考方案1】:

您对UDPSocket-&gt;waitForBytesWritten(); 的调用使您的循环等待直到刷新套接字。要么不调用UDPSocket-&gt;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协议,因为这种情况偶尔丢一两个数据... 查看详情