一种简单的UDP网络重传机制

本文记录了一位开发者在处理UDP网络传输中遇到的重传问题及其解决方案。最初采用多线程处理导致资源消耗大及系统限制问题,后改用在同一事务中检查消息发送状态和超时,实现更高效、简洁的重传机制。作者期待获得读者的建议和优化方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作一年多,在技术层面上一直没有太大的成就。总感觉每天都在重复着一件事情,需求,改,需求,再改。在这种重复中,开始变得有些暴躁。很希望能也有所突破,今天刚刚开通了优快云博客。决定在这个满是大牛的平台上,留下自己的每一点学习过程,也在大家面前呈现自己的编程错误和误区。希望各位大牛能不惜赐教,对文章中有的错误一定要指出来,这会是我最大的收获。

前段时间,经手一个网络相关软件的开发。由于是新手,在接触到这个项目的时候一时没有太多的头绪。其中有一个关于UDP网络传输中的重传问题,思考了好久自己只能想到一个很耗费资源和调度的方法。最初的想法是这样的:

功能要求是消息发送间隔1秒,需要有三次重传的机制,当超过三次则改发送间隔为3秒。

1、建立消息处理结构:包括消息ID、消息状态(是否发送成功)、重传次数、重传超时时间。

2、建立接收消息线程,当受到消息时,通过消息的ID将消息的状态设定为发送成功。

3、建立发送消息方法,将消息加入发送队列,调用线程循环:判断消息状态(break)、发送消息、sleep、重传次数++、判断重传次数,修改sleep时间。


如此一来,虽说实现了消息的发送,但是对于程序的执行起来,每一次发送都需要新起调用线程进行处理。一来程序的开销变得很大;二来,受Windows系统线程最大数量的限制,当连续收发一段时间之后软件最终崩溃了。查询得知可能是系统限制上的问题之后,居然考虑到了调用线程池的方式来处理这样的问题。在进行过一番尝试之后,发现这样的处理只是使这一块的调度变得很是复杂,且多线程之间的数据同步也出现了问题。后来在老大的建议和方案之下,进行了如下的改进。这里就用简单的代码进行说明下。

class Message
{
 
 
    public int Status { get; set; }	//记录消息的发送状态
    public DateTime SendTime { get; set; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值