udp通信的消息处理方案
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. 外部还需要提供一个定时器来定时查看接收和发送历史
}
udp通信的消息处理方案的更多相关文章
- 【RL-TCPnet网络教程】第17章 RL-TCPnet之UDP通信
第17章 RL-TCPnet之UDP通信 本章节为大家讲解RL-TCPnet的UDP通信实现,学习本章节前,务必要优先学习第16章UDP用户数据报协议基础知识.有了这些基础知识之后,再搞本章 ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.2
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.4.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- HP-SOCKET TCP/UDP通信框架库解析
项目概述: HP-SOCKET是一套通用TCP/UDP通信框架,包括服务器.客户端.Agent组件:其目标是提供高性能.通用性.简易性.可扩展.可定制: 鉴于此,其仅实现基本的通用框架通信.数据收发功 ...
- .Net开发笔记(十四) 基于“泵”的UDP通信(接上篇)
上一篇中说到了“泵”在编程中的作用以及一些具体用处,但没有实际demo,可能不好理解,这篇文章我分享一个UDP通信的demo,大概实现了类似“飞鸽传书”在局域网中文本消息和文件传输的功能.功能不全也不 ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
随机推荐
- php总结6——自定义函数、引用传值
6.1 自定义函数 function 函数名称(参数[=默认值],参数[=默认值]...){ 函数体 [return val]; } 1) 无参数无返回 2) 有参数无返回 3) 有参数有返回 函数中 ...
- git学习------>"Agent admitted failure to sign using the key." 问题解决方法
今天用git clone 命令clone服务器上的代码时候报了如下的错误: ouyangpeng@oyp-ubuntu:~/Android/git_canplay_code$ git clone gi ...
- python获取本机IP地址
方法一 通常使用socket.gethostname()方法即可获取本机IP地址,但有时候获取不到(比如没有正确设置主机名称) import socket #获取计算机名称hostname=socke ...
- 怎样避免C#中将小数转换为字符串时出现科学记数法
在C#中如果float.double.decimal类型的值,小数点后的0太多时,C#会用科学记数法来表示小数的值. 例如下面的double类型0.00009,如果我们直接将其用ToString()方 ...
- 20145239 《Java程序设计》第5周学习总结
20145239 <Java程序设计>第5周学习总结 教材学习内容总结 (一)掌握try...catch...finally处理异常的方法: 程序中有许多意想不到的错误,所以我们要学会一些 ...
- php 获取上上个月数据 使用 strtotime('-1 months')的一个bug
今天,使用php 日期函数处理数据,发现一个问题. 具体场景是这样的,我一直以为strtotime 格式化当前日期 或 指定日期可以找到对应的数据,比如我要查找上上个与的数据,因为我要获取当前时间的 ...
- Linux之make的用法讲解
在 Linux环境下使用 GNU 的 make工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译.连接以至于最后的执行.不过这需要我们投入一些时间去完成一个或者多个 ...
- Contiki clock模块
一.functions for handling system time clock_time_t clock_time(void);//return the current system time ...
- 7.8 LZW压缩的实现
7-10 lzw.c #include <stdlib.h> #include <stdio.h> #define BITS 12 //每个数据项的二进制位数 #define ...
- ansible mysql模块的使用今年
摘自: https://www.ibm.com/developerworks/cn/linux/1502_lih_ansible/