skywind3000 / kcp

:zap: KCP - A Fast and Reliable ARQ Protocol

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

KCP在高延迟环境下怎样使用才能满足大流量,而不是快速响应?

haozia816 opened this issue · comments

我们需要同时工作在TCP和UDP协议中,所以选择了使用KCP,但是我的软件中还需要传输文件,我测试了在高延迟(1s)环境中,TCP协议、2048的窗口也只能达到400k左右的速度,还经常出现传输中断,ikcp_input后KCP再无任何响应。请问在高延迟环境中,只要求大流量而不要求快速响应我应该怎么使用呢?
无延迟环境测试为16M/S

自己再 issue 里翻翻,别人传输速度比你这个快。

自己再 issue 里翻翻,别人传输速度比你这个快。

麻烦大神指导下呢,没有找到相似的issue,我是asio实现的,下面是伪代码

boost::asio::stready_timer	m_timer;

void active_update()
{
	ikcp_update(m_kcp);
	m_timer.expires_at(ikcp_check(m_kcp));
	m_timer.async_wait([]
	{
		active_update();
	});
}

//实例启动
void start()
{
	//开启周期性update
	active_update();
}

//网络接收到数据
void handle_recv(const uint8_t* data, size_t size)
{
	ikcp_input(m_kcp, data, size);
	while (true)
	{
		int len = ikcp_recv(m_kcp, buffer1);
		if(len == -1)
		{
			break; //无可用数据,结束while循环
		}
		//处理KCP接收到的数据,存储在buffer1中
		......
	}
	while (ikcp_waitsnd(m_kcp) < m_kcp->snd_wnd * 2)
	{
		//发送队列未满,继续读取文件发送
		if (pf) //FILE* pf;
		{
			fread(buffer2, 1, m_kcp->mss, pf);
			ikcp_send(m_kcp, buffer2, m_kcp->mss);
			active_update(); //测试过这里只能执行ikcp_update,执行ikcp_flush的话,数据不会立刻发送
		}
		else
		{
			break;
		}
	}
}