Update README.md

update doc
This commit is contained in:
Linwei 2014-12-30 17:59:54 +08:00
parent 91bc738f9a
commit cfb0f3a747

View File

@ -58,45 +58,43 @@ TCP是为流量设计的每秒内可以传输多少KB的数据讲究的
# 基本使用
* 创建 KCP对象
1. 创建 KCP对象
```cpp
// 初始化 kcp对象conv为一个表示会话编号的整数和tcp的 conv一样通信双
// 方需保证 conv相同相互的数据包才能够被认可user是一个给回调函数的指针
ikcpcb *kcp = ikcp_create(conv, user);
```
```cpp
// 初始化 kcp对象conv为一个表示会话编号的整数和tcp的 conv一样通信双
// 方需保证 conv相同相互的数据包才能够被认可user是一个给回调函数的指针
ikcpcb *kcp = ikcp_create(conv, user);
```
* 设置回调函数:
2. 设置回调函数:
```cpp
// KCP的下层协议输出函数KCP需要发送数据时会调用它
// buf/len 表示缓存和长度
// user指针为 kcp对象创建时传入的值用于区别多个 KCP对象
int udp_output(const char *buf, int len, ikcpcb *kcp, void *user)
{
....
}
// 设置回调函数
kcp->output = udp_output;
```
```cpp
// KCP的下层协议输出函数KCP需要发送数据时会调用它
// buf/len 表示缓存和长度
// user指针为 kcp对象创建时传入的值用于区别多个 KCP对象
int udp_output(const char *buf, int len, ikcpcb *kcp, void *user)
{
....
}
// 设置回调函数
kcp->output = udp_output;
```
3. 循环调用 update
* 循环调用 update
```cpp
// 以一定频率调用 ikcp_update来更新 kcp状态并且传入当前时钟毫秒单位
// 如 10ms调用一次或用 ikcp_check确定下次调用 update的时间不必每次调用
ikcp_update(kcp, millisec);
```
```cpp
// 以一定频率调用 ikcp_update来更新 kcp状态并且传入当前时钟毫秒单位
// 如 10ms调用一次或用 ikcp_check确定下次调用 update的时间不必每次调用
ikcp_update(kcp, millisec);
```
4. 输入一个下层数据包:
* 输入一个下层数据包:
```cpp
// 收到一个下层数据包比如UDP包时需要调用
ikcp_input(kcp, received_udp_packet, received_udp_size);
```
处理了下层协议的输出/输入后 KCP协议就可以正常工作了使用 ikcp_send来向远端发
送数据。而另一端使用ikcp_recv(kcp, ptr, size)来接收数据。
```cpp
// 收到一个下层数据包比如UDP包时需要调用
ikcp_input(kcp, received_udp_packet, received_udp_size);
```
处理了下层协议的输出/输入后 KCP协议就可以正常工作了使用 ikcp_send 来向远端发送数据。而另一端使用 ikcp_recv(kcp, ptr, size)来接收数据。
# 协议配置
@ -105,24 +103,18 @@ ikcp_input(kcp, received_udp_packet, received_udp_size);
1. 工作模式:
int ikcp_nodelay(ikcpcb *kcp, int nodelay, int interval, int resend, int nc)
int ikcp_nodelay(ikcpcb *kcp, int nodelay, int interval, int resend, int nc)
nodelay :是否启用 nodelay模式0不启用1启用。
interval :协议内部工作的 interval单位毫秒比如 10ms或者 20ms
resend 快速重传模式默认0关闭可以设置22次ACK跨越将会直接重传
nc 是否关闭流控默认是0代表不关闭1代表关闭。
普通模式:`ikcp_nodelay(kcp, 0, 40, 0, 0);
极速模式: ikcp_nodelay(kcp, 1, 10, 2, 1);
2. 最大窗口:
int ikcp_wndsize(ikcpcb *kcp, int sndwnd, int rcvwnd);
int ikcp_wndsize(ikcpcb *kcp, int sndwnd, int rcvwnd);
该调用将会设置协议的最大发送窗口和最大接收窗口大小默认为32.
3. 最大传输单元:
@ -135,19 +127,18 @@ ikcp_input(kcp, received_udp_packet, received_udp_size);
不管是 TCP还是 KCP计算 RTO时都有最小 RTO的限制即便计算出来RTO为40ms
于默认的 RTO是100ms协议只有在100ms后才能检测到丢包快速模式下为30ms
以手动更改该值:
```cpp
kcp->rx_minrto = 10;
```
```cpp
kcp->rx_minrto = 10;
```
# 最佳实践
#### 内存分配器
默认KCP协议使用 malloc/free进行内存分配释放如果应用层接管了内存分配可以用
ikcp_allocator来设置新的内存分配器注意要在一开始设置
默认KCP协议使用 malloc/free进行内存分配释放如果应用层接管了内存分配可以用ikcp_allocator来设置新的内存分配器注意要在一开始设置
```cpp
ikcp_allocator(my_new_malloc, my_new_free);
```
```cpp
ikcp_allocator(my_new_malloc, my_new_free);
```
#### 前向纠错注意