QtNetworkgNg is a coroutine-based network toolkit, like boost::asio but uses concepts from QtNetwork and gevent of Python. Compare to boost::asio and Qt's QtNetwork, QtNetworkNg has more simpler API. As the name suggests, QtNetworkNg requires Qt5 framework. For more detail visit:
Visit https://qtng.org/
- General Coroutine with similar API to QThread.
Socket
supports UDP and TCP.SSLSocket
with similar API toSocket
.KcpSocket
implements KCP over UDP.HttpSession
implements a HTTP 1.0/1.1 client.HttpServr
implements a static HTTP 1.0/1.1 server, can be used for reversed http proxy.Cipher
,MessageDigest
,PublicKey
,PrivateKey
wrap complicate LibreSSL C API.
Here comes a simple example to get web pages.
#include <QtCore/QCoreApplication>
#include "qtnetworkng.h"
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
qtng::HttpSession session;
qtng::HttpResponse r = session.get("http://example.com/");
qDebug() << r.html();
return 0;
}
And another exmaple to make tcp connection.
#include <QtCore/QCoreApplication>
#include "qtnetworkng.h"
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
qtng::Socket conn;
conn.connect("example.com", 80);
conn.sendall("GET / HTTP/1.0\r\n\r\n");
qDebug() << conn.recv(1024 * 8);
return 0;
}
To create tcp server.
Socket s;
CoroutineGroup workers;
s.bind(QHostAddress::Any, 8000);
s.listen(100);
while (true) {
QSharedPointer<Socket> request(s.accept());
if (request.isNull()) {
break;
}
workers.spawn([request] {
request->sendall("hello!");
request->close();
});
}
A Qt GUI example to fetch web page.
// main.cpp
#include <QApplication>
#include <QTextBrowser>
#include "qtnetworkng.h"
using namespace qtng;
class HtmlWindow: public QTextBrowser
{
public:
HtmlWindow();
virtual ~HtmlWindow() override;
private:
CoroutineGroup *operations;
};
HtmlWindow::HtmlWindow()
:operations(new CoroutineGroup)
{
operations->spawn([this] {
Coroutine::sleep(1);
HttpSession session;
HttpResponse response = session.get("http://www.example.com/");
if(response.isOk()) {
setHtml(response.html());
} else {
setHtml("failed");
}
});
}
HtmlWindow::~HtmlWindow()
{
delete operations;
}
int main(int argc, char **argv)
{
QApplication app(argc, argv);
HtmlWindow w;
w.show();
return startQtLoop(); // Qt GUI application start the eventloop using startQtLoop() instead of app.exec()
}
And its project file.
# fetch_web_content.pro
TEMPLATE = app
QT += widgets
SOURCES += main.cpp
include(qtnetworkng/qtnetworkng.pri)
As you can see, networking programming is done with very simple API.
The QtNetworkNg is distributed under LGPL 3.0 license.
You can obtain a copy of LGPL 3.0 license at: https://www.gnu.org/licenses/lgpl-3.0.en.html
QtNetworkNg require QtCore, QtNetwork to build. SSL and crypto is supported using embedded LibreSSL.
Qt 5 - https://www.qt.io/download
Linux, Windows, Android and OpenBSD is supported. Macos, iOS is not tested yet, as I have no mac machines.
QtNetworkNg uses more effective boost::context asm code in arm, arm64, x86, amd64 machines, and uses native ucontext or windows fiber API in other architectures.
- Complete reference documents
- Implements an HTTP 1.0 server.
- HTTP support gzip compression.
- HttpResponse support stream.
- Support HTTP proxy and cache.
- A simple replacement for libev in Windows.
- Add more OpenSSL functions.
- Support verification for https connection.
- Support MacOS and iOS platforms.
- Remove QtNetwork dependence.
- Clone QtNetworkNg from github as git subrepository.
- include
qtnetworkng/qtnetworkng.pri
in yourproject.pro
file. - include
qtnetworkng.h
in you cpp files.
Create a pull request on github.com with your patch, then make a pull request to me.