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) {