skywind3000 / kcp

:zap: KCP - A Fast and Reliable ARQ Protocol
MIT License
15.35k stars 2.5k forks source link

感谢大神提供这么厉害的算法,我给 KCP 封装了一个简单的 C++ 接口,可否携带分发 ikcp.c? #269

Open hgoldfish opened 4 years ago

hgoldfish commented 4 years ago

没有其它的特性,只是简单地基于 UDP 封装了一个类似于 TCP 的接口,很简单的工作,见笑了:

https://github.com/hgoldfish/qtnetworkng/blob/master/include/kcp.h

使用方式大概是这样:

//client.cpp
#include "qtnetworkng.h"
void main()
{
    KcpSocket s;
    if (s.connect("remotehost", 8000)) {
        s.sendall("hello!");
    }
}

//server.cpp
void main() {
    KcpSocket s;
    s.bind(8000);
    s.listen(50);
    while (true) {
        QSharedPointer<KcpSocket> req = s.accept();
        if (!req) break;
        Coroutine::spawn([req] {
            qDebug() << req->recvall();
        });
    }
}

请问一下作者,QtNetworkNg 这个网络库采用的是 LGPL 协议,能够直接嵌入 kcp 吗?我把 kcp 的 LICENSE 文件已经带上。

swxlion commented 4 years ago

C++代码放入.c文件?这操作。。。。。

hgoldfish commented 4 years ago

C++代码放入.c文件?这操作。。。。。

C++ 原本就能够调用 C 语言接口的啊,比如 C++ 调用 openssl 和 ffmpeg 也很常见。kcp 没有独立的 makefile 制作成 .so,貌似除了放到工程里面编译,也没其它的好办法了。不过我不太了解是否 KCP 的授权协议允许这么干,所以过来问一下。

swxlion commented 4 years ago

C++能调用C,没错。但请你先弄明白 .c, .cpp的区别。你在.c里面写一个class,你让其他的C编译器怎么工作?

hgoldfish commented 4 years ago

C++能调用C,没错。但请你先弄明白 .c, .cpp的区别。你在.c里面写一个class,你让其他的C编译器怎么工作?

我说的是在我的 C++ 网络库调用了 c 语言写的 kcp.c,是链接在一起,没有修改 skywind3000 大神提供的 ikcp.c 文件。我的封装放在另外的 C++ 源文件 kcp.cpp 里面。

这东东我已经做好了,链接放在最上面,你可以点进去看一下。我所问的事情是,LGPL 3.0 是否兼容 MIT 协议?

skywind3000 commented 4 years ago

可以嵌入,没问题。

rise-worlds commented 3 years ago

嵌入你这个是不是还要嵌入个QT进来,建议使用纯C++的标准,不要带其它库。

hgoldfish commented 3 years ago

嵌入你这个是不是还要嵌入个QT进来,建议使用纯C++的标准,不要带其它库。

我弄了一个跑在 KCP 上面的 https,以及跑在 KCP 上面的 RPC. 因为 HTTP 协议涉及到 url, cookie, json 等等,我不想重新造那些轮子,所以选择依赖 Qt. 如果有兴趣的话,你可以考虑 fork 我这个库,重写协程部分适配到 cpp20 的 coroutine,再加上 libjson 之类的,应该会有很多人感兴趣。。但我现在没精力做这件事情了。

luodaoyi commented 3 months ago

大佬能顺手封装一个c++版的 Fec不。