A network library implemented in C++, supports TCP/UDP/HTTP/HTTP2/WebSocket/SSL on platform Linux/Windows/OSX/iOS/Android.
No Data
kuma is a multi-platform support network library developed in C++. It implements interfaces for TCP/UDP/Multicast/HTTP/HTTP2/WebSocket/timer that drove by event loop. kuma supports epoll/poll/WSAPoll/IOCP/kqueue/select on platform Linux/Windows/OSX/iOS/Android.
git clone https://github.com/Jamol/kuma.git git submodule update --init
define macro KUMA_HAS_OPENSSL to enable openssl
open project bld/ios/kuma with xcode and build it
open project bld/mac/kuma with xcode and build it
open bld/windows/kuma.sln with VS2017 and build it
$ cd src $ make
$ cd src/jni $ ndk-build
CMake is also supported: python ./bld/your_os/build_your_os.py
certificates location is by default in /path-to-your-excutable/cert.copy all CA certificates used to cert/ca.pem copy your server certificate to cert/server.pem copy your server private key to cert/server.key
Please refer to test for more examples
#include "kmapi.h" #include "libkev/src/util/defer.h"using namespace kuma;
int main(int argc, char *argv[]) { kuma::init(); DEFER(kuma::fini());
EventLoop main_loop(PollType::NONE); if (!main_loop.init()) { printf("failed to init EventLoop\n"); return -1; } WebSocket ws(&main_loop, "HTTP/1.1"); ws.setOpenCallback([] (KMError err) { printf("ws.onOpen, err=%d\n", err); }); ws.setDataCallback([] (KMBuffer &data, bool is_text, bool is_fin) { printf("ws.onData, len=%lu\n", data.chainLength()); }); ws.setWriteCallback([] (KMError err) { printf("ws.onWrite, write available\n"); }); ws.setErrorCallback([] (KMError err) { printf("ws.onError, err=%d\n", err); }); ws.setSubprotocol("jws"); ws.setOrigin("www.jamol.cn"); ws.connect("wss://127.0.0.1:8443/"); Timer timer(&main_loop); timer.schedule(1000, Timer::Mode::ONE_SHOT, [] { printf("onTimer\n"); }); main_loop.loop(); return 0;
}
#include "kmapi.h" #include "libkev/src/util/defer.h"using namespace kuma;
int main(int argc, char *argv[]) { kuma::init(); DEFER(kuma::fini());
EventLoop main_loop(PollType::NONE); if (!main_loop.init()) { printf("failed to init EventLoop\n"); return -1; } WebSocket ws(&main_loop); ws.setOpenCallback([] (KMError err) { printf("ws.onOpen, err=%d\n", err); }); ws.setDataCallback([] (KMBuffer &data, bool is_text, bool is_fin) { printf("ws.onData, len=%lu\n", data.chainLength()); }); ws.setWriteCallback([] (KMError err) { printf("ws.onWrite, write available\n"); }); ws.setErrorCallback([] (KMError err) { printf("ws.onError, err=%d\n", err); }); TcpListener server(&main_loop); server.setAcceptCallback([&ws] (SOCKET_FD fd, const char* ip, uint16_t port) -> bool { printf("server.onAccept, ip=%s\n", ip); ws.setSslFlags(SSL_ENABLE); ws.attachFd(fd, nullptr, [] (KMError err) { printf("ws.onHandshake, err=%d\n", err); return true; }); return true; }); server.setErrorCallback([] (KMError err) { printf("server.onError, err=%d\n", err); }); auto ret = server.startListen("0.0.0.0", 8443); if (ret != KMError::NOERR) { printf("failed to listen on 8443\n"); } main_loop.loop(); return 0;
}