From 8a61662d1c0d1742348d57ae4d6bbcad01ea5508 Mon Sep 17 00:00:00 2001 From: xiaocheng <lh563566994@126.com> Date: Thu, 2 Feb 2017 12:07:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20utf8-without-bom=20?= =?UTF-8?q?=E7=BC=96=E7=A0=81=EF=BC=8C=E5=90=A6=E5=88=99=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20sublime=20=E6=89=93=E5=BC=80=E6=B3=A8=E9=87=8A=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E4=B9=B1=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test.cpp | 68 ++++++++++++++++++++++++++++---------------------------- test.h | 22 +++++++++--------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/test.cpp b/test.cpp index feec63d..0c85cdf 100644 --- a/test.cpp +++ b/test.cpp @@ -1,8 +1,8 @@ //===================================================================== // -// test.cpp - kcp �������� +// test.cpp - kcp 测试用例 // -// ˵���� +// 说明: // gcc test.cpp -o test -lstdc++ // //===================================================================== @@ -14,10 +14,10 @@ #include "ikcp.c" -// ģ������ +// 模拟网络 LatencySimulator *vnet; -// ģ�����磺ģ�ⷢ��һ�� udp�� +// 模拟网络:模拟发送一个 udp包 int udp_output(const char *buf, int len, ikcpcb *kcp, void *user) { union { int id; void *ptr; } parameter; @@ -26,18 +26,18 @@ int udp_output(const char *buf, int len, ikcpcb *kcp, void *user) return 0; } -// �������� +// 测试用例 void test(int mode) { - // ����ģ�����磺������10%��Rtt 60ms~125ms + // 创建模拟网络:丢包率10%,Rtt 60ms~125ms vnet = new LatencySimulator(10, 60, 125); - // ���������˵�� kcp����һ������ conv�ǻỰ��ţ�ͬһ���Ự��Ҫ��ͬ - // ���һ���� user�������������ݱ�ʶ + // 创建两个端点的 kcp对象,第一个参数 conv是会话编号,同一个会话需要相同 + // 最后一个是 user参数,用来传递标识 ikcpcb *kcp1 = ikcp_create(0x11223344, (void*)0); ikcpcb *kcp2 = ikcp_create(0x11223344, (void*)1); - // ����kcp���²����������Ϊ udp_output��ģ��udp����������� + // 设置kcp的下层输出,这里为 udp_output,模拟udp网络输出函数 kcp1->output = udp_output; kcp2->output = udp_output; @@ -49,27 +49,27 @@ void test(int mode) int count = 0; int maxrtt = 0; - // ���ô��ڴ�С��ƽ���ӳ�200ms��ÿ20ms����һ������ - // �����ǵ������ط�����������շ�����Ϊ128 + // 配置窗口大小:平均延迟200ms,每20ms发送一个包, + // 而考虑到丢包重发,设置最大收发窗口为128 ikcp_wndsize(kcp1, 128, 128); ikcp_wndsize(kcp2, 128, 128); - // �жϲ���������ģʽ + // 判断测试用例的模式 if (mode == 0) { - // Ĭ��ģʽ + // 默认模式 ikcp_nodelay(kcp1, 0, 10, 0, 0); ikcp_nodelay(kcp2, 0, 10, 0, 0); } else if (mode == 1) { - // ��ͨģʽ���ر����ص� + // 普通模式,关闭流控等 ikcp_nodelay(kcp1, 0, 10, 0, 1); ikcp_nodelay(kcp2, 0, 10, 0, 1); } else { - // ��������ģʽ - // �ڶ������� nodelay-�����Ժ����ɳ�����ٽ����� - // ���������� intervalΪ�ڲ�����ʱ�ӣ�Ĭ������Ϊ 10ms - // ���ĸ����� resendΪ�����ش�ָ�꣬����Ϊ2 - // ��������� Ϊ�Ƿ���ó������أ������ֹ + // 启动快速模式 + // 第二个参数 nodelay-启用以后若干常规加速将启动 + // 第三个参数 interval为内部处理时钟,默认设置为 10ms + // 第四个参数 resend为快速重传指标,设置为2 + // 第五个参数 为是否禁用常规流控,这里禁止 ikcp_nodelay(kcp1, 1, 10, 2, 1); ikcp_nodelay(kcp2, 1, 10, 2, 1); kcp1->rx_minrto = 10; @@ -88,51 +88,51 @@ void test(int mode) ikcp_update(kcp1, iclock()); ikcp_update(kcp2, iclock()); - // ÿ�� 20ms��kcp1�������� + // 每隔 20ms,kcp1发送数据 for (; current >= slap; slap += 20) { ((IUINT32*)buffer)[0] = index++; ((IUINT32*)buffer)[1] = current; - // �����ϲ�Э��� + // 发送上层协议包 ikcp_send(kcp1, buffer, 8); } - // �����������磺����Ƿ���udp����p1->p2 + // 处理虚拟网络:检测是否有udp包从p1->p2 while (1) { hr = vnet->recv(1, buffer, 2000); if (hr < 0) break; - // ��� p2�յ�udp������Ϊ�²�Э�����뵽kcp2 + // 如果 p2收到udp,则作为下层协议输入到kcp2 ikcp_input(kcp2, buffer, hr); } - // �����������磺����Ƿ���udp����p2->p1 + // 处理虚拟网络:检测是否有udp包从p2->p1 while (1) { hr = vnet->recv(0, buffer, 2000); if (hr < 0) break; - // ��� p1�յ�udp������Ϊ�²�Э�����뵽kcp1 + // 如果 p1收到udp,则作为下层协议输入到kcp1 ikcp_input(kcp1, buffer, hr); } - // kcp2���յ��κΰ������ػ�ȥ + // kcp2接收到任何包都返回回去 while (1) { hr = ikcp_recv(kcp2, buffer, 10); - // û���յ������˳� + // 没有收到包就退出 if (hr < 0) break; - // ����յ����ͻ��� + // 如果收到包就回射 ikcp_send(kcp2, buffer, hr); } - // kcp1�յ�kcp2�Ļ������� + // kcp1收到kcp2的回射数据 while (1) { hr = ikcp_recv(kcp1, buffer, 10); - // û���յ������˳� + // 没有收到包就退出 if (hr < 0) break; IUINT32 sn = *(IUINT32*)(buffer + 0); IUINT32 ts = *(IUINT32*)(buffer + 4); IUINT32 rtt = current - ts; if (sn != next) { - // ����յ��İ������� + // 如果收到的包不连续 printf("ERROR sn %d<->%d\n", (int)count, (int)next); return; } @@ -161,9 +161,9 @@ void test(int mode) int main() { - test(0); // Ĭ��ģʽ������ TCP������ģʽ�������ش����������� - test(1); // ��ͨģʽ���ر����ص� - test(2); // ����ģʽ�����п��ض����ҹر����� + test(0); // 默认模式,类似 TCP:正常模式,无快速重传,常规流控 + test(1); // 普通模式,关闭流控等 + test(2); // 快速模式,所有开关都打开,且关闭流控 return 0; } diff --git a/test.h b/test.h index 1dd4319..b40e3cc 100644 --- a/test.h +++ b/test.h @@ -83,7 +83,7 @@ static inline void isleep(unsigned long millisecond) #include <list> #include <vector> -// ���ӳٵ����ݰ� +// 带延迟的数据包 class DelayPacket { public: @@ -113,7 +113,7 @@ protected: IUINT32 _ts; }; -// ���ȷֲ�������� +// 均匀分布的随机数 class Random { public: @@ -142,7 +142,7 @@ protected: std::vector<int> seeds; }; -// �����ӳ�ģ���� +// 网络延迟模拟器 class LatencySimulator { public: @@ -151,20 +151,20 @@ public: clear(); } - // lostrate: ����һ�ܶ����ʵİٷֱȣ�Ĭ�� 10% - // rttmin��rtt��Сֵ��Ĭ�� 60 - // rttmax��rtt���ֵ��Ĭ�� 125 + // lostrate: 往返一周丢包率的百分比,默认 10% + // rttmin:rtt最小值,默认 60 + // rttmax:rtt最大值,默认 125 LatencySimulator(int lostrate = 10, int rttmin = 60, int rttmax = 125, int nmax = 1000): r12(100), r21(100) { current = iclock(); - this->lostrate = lostrate / 2; // �������������������ʣ����̳���2 + this->lostrate = lostrate / 2; // 上面数据是往返丢包率,单程除以2 this->rttmin = rttmin / 2; this->rttmax = rttmax / 2; this->nmax = nmax; tx1 = tx2 = 0; } - // ������� + // 清除数据 void clear() { DelayTunnel::iterator it; for (it = p12.begin(); it != p12.end(); it++) { @@ -177,8 +177,8 @@ public: p21.clear(); } - // �������� - // peer - �˵�0/1����0���ͣ���1���գ���1���ʹ�0���� + // 发送数据 + // peer - 端点0/1,从0发送,从1接收;从1发送从0接收 void send(int peer, const void *data, int size) { if (peer == 0) { tx1++; @@ -201,7 +201,7 @@ public: } } - // �������� + // 接收数据 int recv(int peer, void *data, int maxsize) { DelayTunnel::iterator it; if (peer == 0) {