项目地址:https://github.com/rtttech/rttp
RTTP特点:
- 数据传输延迟低,官方给出的测试数据显示,在丢包率10%-20%的网络状况下,rttp的传输延迟仍保持在50毫秒以下,同样的环境下,TCP的传输延迟已达到几百毫秒,完全无法正常游戏。
- 数据传输过程中客户端IP和端口发生变化不会对已建立的连接有任何影响,特别适合手机端游戏。TCP在这种情况下一定会出现连接中断的情况。
- 传输速度快,高峰时段数据传输速度是TCP的10倍以上。
- 高性能,单线程支持并发连接2000以上。
- 简单易用,接口类似于TCP。
- 不依赖于具体的传输协议,一般情况下使用UDP来传输数据包,但使用raw socket,甚至ICMP完全可行。
使用方法:
- 初始化RTTP,整个进程只需要调用一次:
int rt_init(const char* str, int len)
2. 设置回调函数,整个进程只需要调用一次:
void rt_set_callback(socket_event_callback *event_callback, send_data_callback *send_proc)
event_callback用于通知RTTP socket状态变化,函数原型:
void socket_event_callback(RTSOCKET socket, int event)一共存在4种事件:连接成功,可读,可写,出错
send_proc用于发送数据包,RTTP协议栈调用该函数发送数据包,函数原型:
void send_proc(RTSOCKET socket, const char * buffer, int len, const char* addr, int addr_len)
3. 创建RTTP socket:
RTSOCKET rt_socket(int mode);
该函数返回创建成功的RTTP socket句柄
4. 和服务器端建立连接:
int rt_connect(RTSOCKET s, const char *to, int tolen)
RTTP协议栈并不直接使用to和tolen指定的地址,该地址会被send_proc回传给使用者,连接成功后,RTTP协议栈会通过event_callback回调函数通知连接成功事件
5. 输入数据包:
使用者每收到一个UDP包(不限于UDP)时,通过rt_incoming_packet函数通知RTTP协议栈
RTSOCKET rt_incoming_packet(const char * buffer, int len, const char *from, int fromlen, void* userdata)
对于服务器端来说,如果有新的RTTP连接接入,这个函数将返回一个新的RTTP socket句柄
6. 输入定时信号:
void rt_tick()
官方文档建议10毫秒左右调用一次
7. 关闭RTTP socket:
void rt_close(RTSOCKET s)
8. 发送数据:
int rt_send(RTSOCKET s, const char * buffer, int len, int flag)
连接建立成功后,可通过rt_send发送数据包,返回发送成功的字节数,-1表示当前不可发送,应该等RTTP协议栈通知可写事件后再发
9. 接收数据:
int rt_recv(RTSOCKET s, char * buffer, int len, int flag)
当RTTP协议栈通知可读事件后,可通过该函数从RTTP socket接收数据,返回接收到缓冲区中的字节数,-1表示当前无可读数据,应该等可读通知后再接收,0表示连接关闭。
其他应用场景:
RTTP协议在其它时延敏感并且要求可靠传输的场合比如直播推流,远程数据传输等,都有不俗的表现。