官方的 kcp 只有算法,实际使用都需要自行封装包结构。我也是照着官方来的。不过需要自行处理缓存区,还有缓存区存太多数据,调用者需要暂停之类的。
我的代码在 github 上面。因为是建立在协程之上的,对你估计没啥参考价值。和一般的 cpp 回调代码很不一样。
https://github.com/hgoldfish/qtnetworkng/blob/master/src/kcp.cpp
举个例子,这一段代码,估计用回调就不好实现:
bool ok = sendingQueueNotFull.tryWait();
if (!ok) {
return -1;
}
qint32 nextBlockSize = qMin<qint32>(static_cast<qint32>(kcp->mss), size - count);
int result;
{
ScopedLock<RLock> l(kcpLock);
result = ikcp_send(kcp, data + count, nextBlockSize);
}
bool ok = sendingQueueNotFull.tryWait();
第一行的意思是如果缓冲区是满了,就暂停当时协程。
ScopedLock<RLock> l(kcpLock);
这一行的意思是如果当前还有另外一个协程正在发送 kcp 包,就等待它发送完,免得交叉发送数据。
【 在 newre 的大作中提到: 】
: 大佬,开源吗?拜读一下代码。
: 我一直找一个kcp的cpp实现
: #发自zSMTH@如有雷同 纯属巧合
: ...................
--
修改:hgoldfish FROM 110.81.1.*
FROM 110.81.1.*