C#实现UDP数据包大文件分包传输和接收组包

作者:小菜 更新时间:2025-03-16 点击数:
简介:如果需要使用UDP传输较大数据,例如传输10M的图片,这突破了UDP的设计原则。

UDP的设计是基于"datagram",也就是它假设你发送的每个数据包都能包含在

【菜科解读】

如果需要使用UDP传输较大数据,例如传输10M的图片,这突破了UDP的设计原则。

UDP的设计是基于"datagram",也就是它假设你发送的每个数据包都能包含在单一的包内。

并且设定UDP数据包的最大长度受基础网络协议的限制。

UDP数据包的理论最大长度限制是 65535 bytes,这包含 8 bytes 数据包头和 65527 bytes 数据。

但如果基于IPv4网络传输,则还需减去 20 bytes 的IP数据包头。

则单一的UDP数据包可传输的数据最大长度为:

MaxUdpDataLength = 65535 - 8 - 20 = 65507 bytes

这就需要实现UDP包的分包传输和接收组包功能。

分包功能

1 ///

2 /// UDP数据包分割器 3 /// 4 public static class UdpPacketSplitter 6 /// 7 /// 分割UDP数据包 8 /// 9 ///

UDP数据包所持有的序号10 ///

被分割的UDP数据包11 ///

分割块的长度12 /// 13 /// 分割后的UDP数据包列表14 /// 15 public static ICollection Split(long sequence, byte[] datagram, int chunkLength)17 if (datagram == null)18 throw new ArgumentNullException("datagram");20 List packets = new List();22 int chunks = datagram.Length / chunkLength;23 int remainder = datagram.Length % chunkLength;24 int total = chunks;25 if (remainder > 0) total++;27 for (int i = 1; i 0)35 int length = datagram.Length - (chunkLength * chunks);36 byte[] chunk = new byte[length];37 Buffer.BlockCopy(datagram, chunkLength * chunks, chunk, 0, length);38 packets.Add(new UdpPacket(sequence, total, total, chunk, length));41 return packets;43 }

发送分包

1 private void WorkThread()

2 { 3 while (IsRunning) 5 waiter.WaitOne(); 6 waiter.Reset(); 8 while (queue.Count > 0)10 StreamPacket packet = null;11 if (queue.TryDequeue(out packet))13 RtpPacket rtpPacket = RtpPacket.FromImage(14 RtpPayloadType.JPEG, 15 packet.SequenceNumber, 16 (long)Epoch.GetDateTimeTotalMillisecondsByYesterday(packet.Timestamp),17 packet.Frame);19 // max UDP packet length limited to 65,535 bytes20 byte[] datagram = rtpPacket.ToArray(); 21 packet.Frame.Dispose();23 // split udp packet to many packets 24 // to reduce the size to 65507 limit by underlying IPv4 protocol25 ICollection udpPackets 26 = UdpPacketSplitter.Split(27 packet.SequenceNumber, 28 datagram, 29 65507 - UdpPacket.HeaderSize);30 foreach (var udpPacket in udpPackets)32 byte[] udpPacketDatagram = udpPacket.ToArray();33 // async sending34 udpClient.BeginSend(35 udpPacketDatagram, udpPacketDatagram.Length,36 packet.Destination.Address,37 packet.Destination.Port,38 SendCompleted, udpClient);43 }

接收组包功能

1 private void OnDatagramReceived(object sender, UdpDatagramReceivedEventArgs e)

2 { 3 try 5 UdpPacket udpPacket = UdpPacket.FromArray(e.Datagram); 7 if (udpPacket.Total == 1) 9 RtpPacket packet = new RtpPacket(udpPacket.Payload, udpPacket.PayloadSize);10 Bitmap bitmap = packet.ToBitmap();11 RaiseNewFrameEvent(12 bitmap, Epoch.GetDateTimeByYesterdayTotalMilliseconds(packet.Timestamp));14 else16 // rearrange packets to one packet17 if (packetCache.ContainsKey(udpPacket.Sequence))19 List udpPackets = null;20 if (packetCache.TryGetValue(udpPacket.Sequence, out udpPackets))22 udpPackets.Add(udpPacket);24 if (udpPackets.Count == udpPacket.Total)26 packetCache.TryRemove(udpPacket.Sequence, out udpPackets);28 udpPackets = udpPackets.OrderBy(u => u.Order).ToList();29 int rtpPacketLength = udpPackets.Sum(u => u.PayloadSize);30 int maxPacketLength = udpPackets.Select(u => u.PayloadSize).Max();32 byte[] rtpPacket = new byte[rtpPacketLength];33 foreach (var item in udpPackets)35 Buffer.BlockCopy(36 item.Payload, 0, rtpPacket, 37 (item.Order - 1) * maxPacketLength, item.PayloadSize);40 RtpPacket packet = new RtpPacket(rtpPacket, rtpPacket.Length);41 Bitmap bitmap = packet.ToBitmap();42 RaiseNewFrameEvent(43 bitmap, 44 Epoch.GetDateTimeByYesterdayTotalMilliseconds(packet.Timestamp));46 packetCache.Clear();50 else52 List udpPackets = new List();53 udpPackets.Add(udpPacket);54 packetCache.AddOrUpdate(55 udpPacket.Sequence, 56 udpPackets, (k, v) => { return udpPackets; });60 catch (Exception ex)62 RaiseVideoSourceExceptionEvent(ex.Message);64 } 实现,UDP,数据,包大,文件,分包,传输,和,接收,

鬼火存在,打火机里注射墨水就能实现不信试试

鬼火很多人都知道,也有不少人知道鬼火实际上就是磷火,是磷的自燃现象,那么既然是火燃烧,难道不会烧到一些东西吗?尤其鬼火通常出现在山林当中,许多人听到鬼火就感觉到胆怯,认为这是一些鬼怪制造出来的火焰,因为这些火焰都是漂浮在空中的,看不见燃烧物,,但是并不是这样,鬼火通常都只是磷火而已,甚至可以制造出漂浮在空中的火焰。

鬼火为何会追着人跑既然刚才提到了鬼火会追着人跑,这本来也是正常的现象。

如果在没有风的时候,空气是静止不动的,磷火自然也不会动,人经过时鬼火追着人跑是因为磷火的重量非常轻,人经过时会带动空气的流动,从而使得磷火随着空气流动而飘动。

鬼火是真实存在的1.一般我们将漂浮在空中的火焰就会称之为鬼火,因为这种现象经常会发生在坟地旁边,所以不少人都觉得这是死去的人变成鬼魂之后导致的,本来并不是这样。

引起鬼火的真相本来是磷这种元素,磷的燃点非常低,漂浮在空中的磷燃烧起来就像看鬼火了,没有燃烧物,而且火焰还是蓝色的。

2.因为历史,无论是中国还其他一些国家,都是流行的土葬,土葬的时候就会将死者的遗体直接放入棺材然后埋进土里。

因为人体的骨骼中有很多磷酸钙,尸体腐烂之后,这些磷就会转变为磷化氢,变成一种燃点气体,很容易自燃,因此就会产生鬼火这种自然现象了,如果遇到鬼火就狂奔,可能鬼火还会跟着自己跑,有时候确实有点吓人。

3.确实想要漂浮在空中的火焰是可以制作出来的,用打火机和墨水就可以,不过不推荐大家在家里制作,看看就好了。

就像上面视频描述的一样,先将打火机的盖子卸下来,然后往打火机里注入墨水,然后盖上盖子就可以了。

这个时候打火机打出来的火就会漂浮在空中,而不是从打火机口里喷出的火,看起来非常的奇怪。

4.不过这种方法对打火机是有一定要求的,必须要磨石打火机才可以,普通的按压打火机是不可以的。

而且这种做法的风险很高,毕竟是打火机,是易燃易爆物品,因此不推荐大家在家里直接尝试,万一打火机质量不可以,打不出来火都还要,如果爆炸了,甚至会对手部造成一定影响,因此看看就好,不要自己动手尝试。

鬼火会引起火灾吗鬼火实际上是不会引起火灾的,我们知道鬼火是因为磷聚集多了,在遇到氧气之后产生的自燃现象,但本来磷火的温度很低,而且一会儿就没了,所以并不会引起火灾。

而且很多人知道鬼火有很多颜色,所以鬼火本来并不是燃烧的结果,而是一种化学发光的现象,磷在和氧气进行化学反应燃烧的过程当中,其释放出来的并不是热量,而是可见光,所以磷火,也就是鬼火,并不会引起火灾。

磷火的温度会烧伤人吗关于鬼火,很多人也知道鬼火会追着人跑,如果人碰着了鬼火,那么人会被烧伤吗?这本来也是不会的,因为磷化氢在空气当中的浓度并不高,在磷化氢和氧气发生反应燃烧的时候,其产生的热量非常的少,都是以光的形式释放,所以既不会引起火灾,也不会烧伤人。

海上航行的水手们有时在晚间会看到他们驾驶的船只桅杆顶端发出一种灵异的蓝色辉光。

这种光不具有高温,也不会引起火灾,人们将它视作一种好运的征兆...查看细节 以上就是关于鬼火真的存在,打火机里注射墨水就能实现不信试试的全部内容,

恢复评估手机数据?一步步解析解决方案

简介:在这个信息化时代,手机承载了我们生活的大量数据,诸如照片、视频、联系信息等。

一旦不慎丢失这些数据,可能会给生活和工作带来不小的麻烦。

本文将针对如何评估和恢复手机数据这一主题,进行深入解析,提供可操作的解决方案,帮助您轻松找回丢失的数据。

我们将详细介绍小白数据恢复软件,通过其强大的功能和简单的操作,帮助用户安全、快速地恢复丢失的数据。

工具原料:系统版本:Windows 10或更新版本,macOS 11或更新版本,Android 11及iOS 14或更新版本品牌型号:支持大多数市场上流行的手机品牌和型号,例如iPhone 12系列、三星Galaxy S21系列、小米11系列等。

软件版本:小白数据恢复软件最新版本一、评估手机数据丢失原因1、数据丢失有多种原因,包括误删除、系统崩溃、软件更新故障和病毒攻击等。

在尝试恢复之前,了解数据丢失的原因有助于评估恢复的可能性及制定相应策略。

2、以系统崩溃和误删为例,当系统崩溃或更新失败时,数据往往被损坏或丢失。

这时候,需要通过专业的数据恢复软件来进行数据恢复。

而对于误删除的情况,只要覆盖没有发生,可恢复的成功率通常较高。

3、在某些情况下,比如设备受损,可能需要专业的数据恢复服务。

评估失效的具体情况能够帮助选择正确的恢复流程和工具。

二、选择合适的数据恢复工具1、市面上有很多数据恢复软件,但并不是所有的软件都能适用于每一个数据丢失场景。

选择一款专业、可靠的数据恢复软件至关重要。

小白数据恢复软件凭借其易用性和高效性赢得了用户的一致好评。

2、该软件支持多种文件格式的恢复,并能够兼容iOS和Android设备。

针对不同的丢失情况,可以选择不同的扫描和恢复模式。

同时,该软件在操作界面设计上非常友好,仅需几步简单操作即可完成恢复。

三、具体操作步骤1、下载安装小白数据恢复软件。

确保下载官方版本,以防病毒和木马的入侵。

完成安装后,启动软件。

2、通过USB将手机连接至电脑,在软件中选择“手机数据恢复”模式。

根据系统提示允许USB调试权限。

3、选择需要恢复的数据类型(如照片、视频、通讯录等),点击“开始扫描”,软件将自动搜索丢失的数据。

4、扫描完成后,预览可供恢复的文件。

选择需要恢复的文件并点击“恢复”,文件将被保存在指定目录中。

拓展内容:1、在数据恢复过程中,预防二次数据损坏至关重要。

不要在数据丢失后进行格式化,同时避免写入新数据,从而提高恢复的成功率。

2、定期备份是防止数据丢失的最佳策略之一。

很多设备提供了自动备份功能,可以将重要数据存储在云端或本地设备上。

比如苹果的iCloud服务、谷歌的Google Drive都提供了数据备份的功能。

3、了解安全的软件使用习惯也很重要,这样可以避免病毒或木马对数据造成损害。

在下载应用程序或文件时,要确保其来源是可信的,并定期对设备进行病毒扫描。

总结:手机数据意外丢失是一件令人头疼的事情,但借助合适的工具和方法,大多数情况下都能成功找回。

通过本文的介绍,您可以评估数据丢失的原因并选择合适的策略恢复数据。

小白数据恢复软件凭借其出色的功能和用户友好的操作体验,为广大用户提供了一种便捷有效的解决方案。

未来,养成良好的备份习惯可以最大程度上避免数据丢失带来的困扰。

加入收藏
               

C#实现UDP数据包大文件分包传输和接收组包

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录