- 主题:c++23?
asio 难用到爆炸。指望 c++ 标准委员会那伙人,还不如指望我做的网络库。
https://qtng.org/
不过现在还是 beta 质量,崩溃虽然很少,性能还是不行。打算今年年底看看能不能发布 1.0 版本。有兴趣的一起搞啊,目前拿来做点不要求性能的桌面程序还是不错的。我自己是应用在不重的后端服务器上。
【 在 lwp (再也不跟人吵架了!!!) 的大作中提到: 】
: 会有传说中的网络库?
:
https://zhuanlan.zhihu.com/p/107360459--
修改:hgoldfish FROM 183.253.138.*
FROM 183.253.138.*
这个库算是我的兴趣,体现我的口味。我觉得 stl 不好用,喜欢 QString/QUrl 这一票,所以特意只做基于 Qt 的网络库。
我其实有想过 coroutine/socket 部分很容易搞成基于 stl 的版本,但 HttpClient/HttpServer,以及后面想搞的 QUIC 等网络协议里面有涉及字符趾/编码/url处理/mime数据库等等好多内容,用 boost 和 stl 做实在太丑了。
我这个库的方向是易用,照抄 python 社区的最佳实践。不用 Qt 实在做不下去。
【 在 cn62 (cn62) 的大作中提到: 】
: 鱼啊,你这个库估计比较难卖啊。。。
: 连我这种用Qt做界面的都把网络独立出来,不用Qt的更不可能用依赖Qt的网络库了。
--
修改:hgoldfish FROM 183.253.138.*
FROM 183.253.138.*
qtng 网络库包含了常见网络开发最方便实践。比如考虑用 HTTP 请求后端服务器。使用 qtng 大概是这样写的:
HttpSession client;
// 简单请求
client.get(url);
//复杂请求
Map<String, String> query;
query.insert("param1", value);
client.post(url, query);
//上传文件
FormData form;
form.addFile("file", filename, filedata);
form.addQuery("param2", value);
client.delete_(url, form);
在以上操作里面,能够自动处理 session, http redirect, mimetype, DNS cache、HTTP cache, 压缩, 友好报错信息等等。以及还有一个独门密技,相当强大。
【 在 cn62 (cn62) 的大作中提到: 】
: 鱼啊,你这个库估计比较难卖啊。。。
: 连我这种用Qt做界面的都把网络独立出来,不用Qt的更不可能用依赖Qt的网络库了。
--
FROM 183.253.138.*
我照抄 python 的 gevent + requests, 用的协程。所以 API 很易用,不像 asio 那么杂乱。
我写的协程库可能是 c++ 领域最完善的协程库。
1. 跟线程一样协程也需要有 lock, condition, semaphore 这些同步设施,我看很多协程库不提供。
2. 协程库版本的 map/reduce
3. 协程间传递消息的队列
4. 启动多个线程,同时执行大量协程(但目前通讯手段还在实现中)
5. 三个协程的实现方式,三种事件循环实现方式。
这部分完全可以用 stl 重写。有兴趣的可以 fork 一下回去改完,我猜不用一个月就能改出 stl 版本。
【 在 mvtec (mvtec) 的大作中提到: 】
: asio是proactive pattern
: 你这个是什么pattern.
--
FROM 183.253.138.*
zeromq 的那个是吗?它不是基础网络库吧。
【 在 eematlab (未辰) 的大作中提到: 】
: 我觉得nng就很好用了啊
--
FROM 183.253.138.*
网络编程特别好用。跟线程一样用,又不用担心线程之间的数据同步。
其它场景的话,用来写编译器 lexer 也很方便。
【 在 fanci (大葡萄) 的大作中提到: 】
: 携程一般用在什么场景?
--
FROM 183.253.138.*
那场景就有点不一样了。zeromq 是 IPC 的一种,现代网络开发确实不该直接使用 raw tcp/http. 我自己也不直接用 qtng, 而是使用跨 java/python/cpp 的 rpc.
qtng 比较基础一点。比如拿它来做爬强,不到100行代码就能同时搞定服务端和客户端。
【 在 eematlab (未辰) 的大作中提到: 】
: 是的zeromq和nanomsg是这类sp的代表
: 也算是基础网络库
: 他把网络需求抽象成4种模型
: ...................
--
FROM 183.253.138.*
异步绕来绕去的,这是根本问题。假如 RPC 协商的时候需要分三步,你看 asio 要怎么写。
而且 asio 的概念复杂,里面元编程太多,到处都是 xx::yy::zz 这样的写法,写起来太麻烦了。qtng 概念多直接:
SslSocket s;
if (!s.connect("remotehost", 80)) error();
if (s.recv(1024) != "stage1") {
s.close();
}
s.send("ok");
if (s.recv(1024) != "stage2") {
s.close();
}
s.send("done!");
就这样操作 s 的方法就行了。
qtng 还有加密的 API,比如使用 qtng 创建一个数字证书——历来是各加密库最复杂的操作:
const QDateTime &now = QDateTime::currentDateTimeUtc();
QMultiMap<Certificate::SubjectInfo, QString> subjects = {
{ Certificate::CommonName, "hgoldfish" },
{ Certificate::Country, "CN" },
}
const PrivateKey &key = PrivateKey::generate(PrivateKey::Rsa, 2048);
const Certificate &cert = Certificate::generate(key,
MessageAlgorithm::SHA256, 1, now, now.addYears(1), subjects);
qDebug() << cert.save(); //PEM
当然,我肯定没有能力去搞什么加密算法。这些 API 只是对 libressl 的包装。libressl 的安全性不错。坏处是 libressl 支持的加密算法较少,而且某些算法缺少硬件加速。
我怀疑 qtng 可能也是 c++ 世界里面最易用的加密 API
【 在 cpper (cpp beginner) 的大作中提到: 】
: asio很好用啊
: #发自zSMTH@ELE-AL00
--
FROM 183.253.138.*
使用协程搞网络编程是唯一正确的姿势。
不过 c++ 的协程还太初级,线程之间协程的协作还基本没有。qtng 打算引入一个跟 go channel 差不多的东东,或许还要更易用点的。
【 在 GoGoRoger (GoGoRoger) 的大作中提到: 】
: 有了协程,就不用考虑堵塞了,异步了,用在io重的应用,实在是太方便了,我觉着c++有了协程,再有个好一点的网络库,就完美了。
: 发自「今日水木 on Mi Note 3」
--
FROM 183.253.138.*
qtng 就是协程啊。目标也是扛高并发。不过目前还没进入性能优化阶段。
【 在 cpper (cpp beginner) 的大作中提到: 】
: 广易用不行啊,服务端用proact模式编写挺方便的,仅次于协程。能抗高并发
: #发自zSMTH@ELE-AL00
--
FROM 183.253.138.*