0、引言

  大家都知道当使用udp通信时,最大的一个问题是会出现丢包的情况,那么如何可以既使用udp来传输,又同时能有效防止丢包呢?

  本文提供一种简单有效的方法,可以显著避免udp丢包的问题。此外,如果要达到类似tcp通信的效果,则需要相应添加其他规则。基于udp来实现tcp的方法有google提供的开源框架——libjingle,大家感兴趣的话,可以下载源码来学习参考。

1、建立发送消息结构体和接收消息结构体

struct SendMsg
{
time_t expire_time;
unsigned int try_count;
int data_len;
char* data;
SendMsg():expire_time(), try_count(), data_len(), data(NULL){}
} struct RecvMsg
{
time_t expire_time;
int data_len;
char* data;
RecvMsg():expire_time(), data_len(), data(NULL){}
}

2、唯一标识消息的来源或消息发送的去处,暂时使用对方的ip和port

struct AddrIndex
{
unsigned short port;
unsigned int ip;
unsigned in tran_id; //数据包标识,由对方生成数据包时进行累加
bool isSend; //是发送的数据还是接收的数据
//实现<运算符操作,因若要在map中使用AddrIndex作为索引项,需要将之实现
bool operator<(const AddrIndex& addrIndex) const
{
if (this->ip < addrIndex.ip)
{
return true;
}
else if (this->ip < addrIndex.ip)
{
return false;
}
if (this->port < addrIndex.port)
{
return true;
}
else if (this->port < addrIndex.port)
{
return false;
}
if (this->tran_id < addrIndex.tran_id)
{
return true;
}
else
{
return false;
}
}
}

3、创建udp数据包核查的数据结构

class UdpCheck
{
private:
map<AddrIndex, SendMsg> send_check_msg;
map<AddrIndex, RecvMsg> recv_check_msg;
int sock_fd;
unsigned int timeout_unit;
unsigned int max_try_count; public:
//公有接口主要如下所示:
//1.当接收到数据包后,查看接收历史是否有一致的数据包,若有则更新历史的数据包 //2.当发送数据包后,查看发送历史是否有一致的数据包,若有则更新历史的数据包,否则插入历史中 //3.当接收数据包后,查看接收历史是否有一致的数据包,若有则更新历史的数据包,否则插入历史中 //4.当接收到发送数据的应答后,就从发送历史中删除相应数据包 //5.当接收请求,但处理失败时,就从接收历史中删除相应数据包 //6. 遍历发送历史中的数据包,判断是否重发,是否删除
//当重试次数没有超过最大值,且记录维持时间小于time_unit*max_try_count时,则不删除,且重发udp数据包 //7. 遍历接收历史,判断是否过期删除 //8. 外部还需要提供一个定时器来定时查看接收和发送历史
}

最新文章

  1. 关于Hadoop用户体系的设想(胡思乱想)
  2. [bzoj4424]Fairy
  3. Access项目文件的版本控制
  4. hdu5255 魔法因子
  5. [设计模式2]--模板(Template)模式
  6. linux环境设置:使ftp不输密码
  7. nefu 197 关键字检索(kmp算法)
  8. Webpack 2 视频教程 011 - Webpack2 中加载 CSS 的相关配置与实战
  9. css中使用if条件在各大浏览器(IE6\IE7\IE8)中hack方法解决教程
  10. python实现二分查找算法
  11. 阿里云学习之IOT物联网套件(客户端与服务端的后台数据传输)
  12. Redis之PHP操作
  13. js清空数组的方法
  14. 利用Visual Studio 2017的扩展开发(VSIX、ItemTemplate) 快速实现项目的半自动化搭建
  15. CHROME浏览器清缓存
  16. 彻底解决(Microsoft Visual C++ 14.0 is required)的步骤123
  17. 在整合spring和mongodb中,提示at org.springframework.data.mapping.model.BasicPersistentEntity.findAnnotation(
  18. html和vue框架
  19. BZOJ4373: 算术天才⑨与等差数列(线段树 hash?)
  20. zip伪加密

热门文章

  1. css 字体的unicode码
  2. Docker中部署puppeteer导出pdf
  3. JavaScript 如何创建search字段
  4. mapreduce的一个模版
  5. Codeforces Round #243 (Div. 1)——Sereja and Two Sequences
  6. ABAP 设置单元格颜色
  7. git 生成patch和应用patch【转】
  8. UVA - 11475 Extend to Palindrome —— 字符串哈希 or KMP or 后缀数组
  9. Buffer的数据存取
  10. gVIM+zencoding快速开发HTML/CSS/JS(适用WEB前端)