在revolver框架中实现了一个高效可靠的RUDP通信方式,这个通信方式是基于UDP实现一种模拟TCP传输数据的行为。在很多实际应用中,udp/TCP都不是最好的通信方式,例如:点对点文件传输、视频数据高速传输、服务器之间大数据备份同步、高实时rts操作类网游等。TCP和UDP在一定程度上是无法满足此类要求。故revolver实现了一套可靠UDP的传输方式。我们先来看看它的传输效率,以下是WINDOWS和LINUX下它的单连接传输速度。
左边的是WIN7下的速度,我测试的极限大概是30M/S,右边是linux下的速度,极限速度在50M/S.
revolver rudp不仅在网络好的情况下可以有很好的速度,在比较差的网络情况下一样可以获得高吞吐量低延迟的通信效果。具体的可以到git上下载revolver做测试,下载:点击打开链接
这里我主要介绍revolver rudp的总体接口和通信协议流程
#define init_rudp_socket() \
CREATE_RUDP()
#define destroy_rudp_socket() \
DESTROY_RUDP()
//创建一个RUDP SOCKET
#define rudp_socket() \
RUDP()->create_socket()
//正常关闭
#define rudp_close(rudp_id) \
RUDP()->close_socket(rudp_id)
//强制关闭
#define rudp_force_close(rudp_id) \
RUDP()->force_close_socket(rudp_id)
//绑定本地地址,一般是本地UDP对象的地址
#define rdup_bind(rudp_id, local_addr) \
RUDP()->bind(rudp_id, local_addr)
//连接远端
#define rudp_connect(rudp_id, remote_addr) \
RUDP()->connect(rudp_id, remote_addr)
//发送数据
#define rudp_send(rudp_id, data, data_size) \
RUDP()->send(rudp_id, data, data_size)
//接受数据
#define rudp_recv(rudp_id, data, data_size) \
RUDP()->recv(rudp_id, data, data_size)
//设置属性
#define rudp_setoption(rudp_id, op_type, op_value) \
RUDP()->setoption(rudp_id, op_type, op_value)
//获取错误码
#define rudp_error(rudp_id) \
RUDP()->get_error(rudp_id)
//获取发送带宽
#define rudp_recv_bandwidth(rudp_id) \
RUDP()->recv_bandwidth(rudp_id)
//获取接受带宽
#define rudp_send_bandwidth(rudp_id) \
RUDP()->send_bandwidth(rudp_id)
//获取RUDP 发送缓冲区的数据大小
#define rudp_send_cache_size(rudp_id) \
RUDP()->send_cache_size(rudp_id)
//获取RUDP 接收缓冲区的数据大小
#define rudp_recv_cache_size(rudp_id) \
RUDP()->recv_cache_size(rudp_id)
enum RUDPOptionType
{
//心跳的时间周期,以毫秒为单位
RUDP_KEEPLIVE = 1,
//NAGLE算法开关
RUDP_NAGLE,
//接受缓冲区大小
RUDP_RECV_BUFF_SIZE,
//发送缓冲区大小
RUDP_SEND_BUFF_SIZE,
//RUDP连接超时断开的KEEPLIVE周期数
RUDP_TIMEOUT_COUNT,
};
enum RUDPErrorCode
{
RUDP_SUCCESS = 0,
RUDP_BIND_FAIL = 1,
RUDP_CONNECT_FAIL = 2,
RUDP_SEND_ERROR = 3,
RUDP_SEND_EAGIN = 4,
};
class RUDPSocket : public IRUDPNetChannel,
public CEventHandler
{
.....
//外部控制方法
public:
int32_t open(int32_t rudp_id_); //打开
void close(); //关闭
void force_close(); //强制关闭
void reset(); //重置
int32_t setoption(int32_t op_type, int32_t op_value); //设置属性
int32_t bind(uint8_t index, uint8_t title); //绑定通信句柄
int32_t connect(const Inet_Addr& remote_addr); //发起连接
int32_t send(const uint8_t* data, int32_t data_size); //发送数据
int32_t recv(uint8_t* data, int32_t data_size); //接收数据
public:
//BUFFER状态接口,BUFFER可以进行数据发送通告
virtual void on_write();
//buffer可以进行数据读取
virtual void on_read();
//错误通告
virtual void on_exception();
...
};
//连接保持协议
#define RUDP_SYN 0x10 //主动发起连接
#define RUDP_SYN2 0x11 //发起连接返回包
#define RUDP_SYN_ACK 0x02 //SYN2的ACK
#define RUDP_FIN 0x13 //主动发起关闭
#define RUDP_FIN2 0x14 //关闭返回包
#define RUDP_KEEPALIVE 0x15 //心跳包
#define RUDP_KEEPALIVE_ACK 0x16 //心跳返回包
//数据协议
#define RUDP_DATA 0x20 //可靠数据
#define RUDP_DATA_ACK 0x23 //可靠数据确认
#define RUDP_DATA_NACK 0X24 //丢包确认
具体的协议实现可以查看rudp/rudp_packet.h文件。这里就不一一介绍了,我们这里重点介绍协议的流程图