{"id":19664862,"url":"https://github.com/anyks/awh","last_synced_at":"2025-04-28T22:31:01.590Z","repository":{"id":37425867,"uuid":"406498507","full_name":"anyks/awh","owner":"anyks","description":"ANYKS - WEB (AWH) C++","archived":false,"fork":false,"pushed_at":"2025-04-22T12:12:40.000Z","size":23614,"stargazers_count":10,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-22T12:27:01.602Z","etag":null,"topics":["anyks","dtls","https-client","https-proxy","https-server","proxy","proxy-server","rest-server","sctp","socks5","socks5-server","tcp-client","tcp-server","tls-server","udp-client","udp-server","web-server","websocket","websocket-client","websocket-server"],"latest_commit_sha":null,"homepage":"https://anyks.com","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anyks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-09-14T19:35:27.000Z","updated_at":"2025-04-22T12:12:44.000Z","dependencies_parsed_at":"2024-01-27T15:32:54.099Z","dependency_job_id":"b82fc6a6-cd05-4e75-bb04-b357cd6763d3","html_url":"https://github.com/anyks/awh","commit_stats":null,"previous_names":[],"tags_count":154,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anyks%2Fawh","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anyks%2Fawh/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anyks%2Fawh/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anyks%2Fawh/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anyks","download_url":"https://codeload.github.com/anyks/awh/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251397576,"owners_count":21583034,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anyks","dtls","https-client","https-proxy","https-server","proxy","proxy-server","rest-server","sctp","socks5","socks5-server","tcp-client","tcp-server","tls-server","udp-client","udp-server","web-server","websocket","websocket-client","websocket-server"],"created_at":"2024-11-11T16:19:24.077Z","updated_at":"2025-04-28T22:30:56.573Z","avatar_url":"https://github.com/anyks.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![ANYKS - WEB](https://raw.githubusercontent.com/anyks/awh/main/img/banner.jpg)](https://anyks.com)\n\n# ANYKS - WEB (AWH) C++\n\n## Project goals and features\n\n- **HTTP / HTTPS**: WEB - CLIENT / SERVER.\n- **WS / WSS**: WebSocket - CLIENT / SERVER.\n- **Proxy**: HTTP(S) / SOCKS5 PROXY - CLIENT / SERVER.\n- **Compress**: GZIP / BZIP2 / ZSTD / LZ4 / LZMA / DEFLATE / BROTLI - compression support.\n- **Authentication**: BASIC / DIGEST - authentication support.\n\n## Supported protocols HTTP/1.1 and HTTP/2 (RFC9113)\n\n## Requirements\n\n- [LZ4](https://lz4.org)\n- [Zlib](http://www.zlib.net)\n- [BZip2](http://www.bzip.org)\n- [Brotli](https://brotli.org)\n- [ZStandart](https://github.com/facebook/zstd)\n- [Lempel–Ziv–Markov](https://github.com/hunter-packages/lzma)\n- [PCRE2](https://www.pcre.org)\n- [OpenSSL](https://www.openssl.org)\n- [CityHash](https://github.com/google/cityhash)\n- [LibIconv](https://www.gnu.org/software/libiconv)\n- [LibIdn2](https://www.gnu.org/software/libidn)\n- [NgHttp2](https://nghttp2.org/documentation/)\n- [NLohmann::json](https://json.nlohmann.me)\n\n## To build and launch the project\n\n### To clone the project\n\n```bash\n$ git clone --recursive https://github.com/anyks/awh.git\n```\n\n### Activate SCTP only (FreeBSD / Linux)\n\n#### FreeBSD\n\n```bash\n$ sudo kldload sctp\n```\n\n#### Linux (Ubuntu)\n\n```bash\n$ sudo apt install libsctp-dev\n$ sudo modprobe sctp\n$ sudo sysctl -w net.sctp.auth_enable=1\n```\n\n```bash\n$ cd ./certs\n$ ./certs.sh example.com\n```\n\n### Build third party for MacOS X, Linux and FreeBSD\n\n```bash\n$ ./build_third_party.sh --idn\n```\n\n### Build on MacOS X, Linux and FreeBSD\n\n```bash\n$ mkdir ./build\n$ cd ./build\n\n$ cmake \\\n -DCMAKE_BUILD_IDN=YES \\\n -DCMAKE_BUILD_TYPE=Release \\\n -DCMAKE_SHARED_BUILD_LIB=YES \\\n ..\n\n$ make\n```\n\n### Build on Windows [MSYS2 MinGW]\n\n#### Development environment configuration\n- [GIT](https://git-scm.com)\n- [Perl](https://strawberryperl.com)\n- [Python](https://www.python.org/downloads/windows)\n- [MSYS2](https://www.msys2.org)\n- [CMAKE](https://cmake.org/download)\n\n#### Assembly is done in MSYS2 - MINGW64 terminal\n\n```bash\n$ pacman -Syuu\n$ pacman -Ss cmake\n$ pacman -S mingw64/mingw-w64-x86_64-cmake\n$ pacman -S make\n$ pacman -S curl\n$ pacman -S wget\n$ pacman -S mc\n$ pacman -S gdb\n$ pacman -S bash\n$ pacman -S clang\n$ pacman -S git\n$ pacman -S autoconf\n$ pacman -S --needed base-devel mingw-w64-x86_64-toolchain\n$ pacman -S mingw-w64-x86_64-dlfcn\n```\n\n### Build third party for MS Windows\n```bash\n$ ./build_third_party.sh\n```\n\n#### Project build\n\n```bash\n$ mkdir ./build\n$ cd ./build\n\n$ cmake \\\n -G \"MSYS Makefiles\" \\\n -DCMAKE_BUILD_IDN=YES \\\n -DCMAKE_BUILD_TYPE=Release \\\n -DCMAKE_SYSTEM_NAME=Windows \\\n -DCMAKE_SHARED_BUILD_LIB=YES \\\n ..\n\n$ cmake --build .\n```\n\n### Example WEB-client multirequests\n```c++\n#include \u003cclient/awh.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass WebClient {\n\tprivate:\n\t\tuint8_t _count;\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\t\t\n\t\tvoid message(const int32_t sid, const uint64_t rid, const uint32_t code, const string \u0026 message){\n\t\t\t(void) rid;\n\t\t\t\n\t\t\tif(code \u003e= 300)\n\t\t\t\tthis-\u003e_log-\u003eprint(\"Request failed: %u %s stream=%i\", log_t::flag_t::WARNING, code, message.c_str(), sid);\n\t\t}\n\t\t\n\t\tvoid active(const client::web_t::mode_t mode, client::awh_t * awh){\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == client::web_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\t\t\t\n\t\t\tif(mode == client::web_t::mode_t::CONNECT){\n\t\t\t\turi_t uri(this-\u003e_fmk);\n\n\t\t\t\tclient::web_t::request_t req1, req2;\n\n\t\t\t\treq1.method = web_t::method_t::GET;\n\t\t\t\treq2.method = web_t::method_t::GET;\n\n\t\t\t\treq1.url = uri.parse(\"/mac/\");\n\t\t\t\treq2.url = uri.parse(\"/iphone/\");\n\n\t\t\t\tawh-\u003esend(std::move(req1));\n\t\t\t\tawh-\u003esend(std::move(req2));\n\t\t\t}\n\t\t}\n\n\t\tvoid entity(const int32_t sid, const uint64_t rid, const uint32_t code, const string \u0026 message, const vector \u003cchar\u003e \u0026 entity, client::awh_t * awh){\n\n\t\t\t(void) sid;\n\t\t\t(void) rid;\n\n\t\t\tthis-\u003e_count++;\n\n\t\t\tcout \u003c\u003c \"RESPONSE: \" \u003c\u003c string(entity.begin(), entity.end()) \u003c\u003c endl;\n\n\t\t\tif(this-\u003e_count == 2)\n\t\t\t\tawh-\u003estop();\n\t\t}\n\n\t\tvoid headers(const int32_t sid, const uint64_t rid, const uint32_t code, const string \u0026 message, const unordered_multimap \u003cstring, string\u003e \u0026 headers){\n\t\t\t(void) sid;\n\t\t\t(void) rid;\n\n\t\t\tfor(auto \u0026 header : headers)\n\t\t\t\tcout \u003c\u003c \"HEADER: \" \u003c\u003c header.first \u003c\u003c \": \" \u003c\u003c header.second \u003c\u003c endl;\n\n\t\t\tcout \u003c\u003c endl;\n\t\t}\n\n\t\tvoid complete(const int32_t sid, const uint64_t rid, const uint32_t code, const string \u0026 message, const vector \u003cchar\u003e \u0026 entity, const unordered_multimap \u003cstring, string\u003e \u0026 headers, client::awh_t * awh){\n\t\t\t(void) sid;\n\t\t\t(void) rid;\n\n\t\t\tthis-\u003e_count++;\n\n\t\t\tfor(auto \u0026 header : headers)\n\t\t\t\tcout \u003c\u003c \"HEADER: \" \u003c\u003c header.first \u003c\u003c \": \" \u003c\u003c header.second \u003c\u003c endl;\n\t\t\t\n\t\t\tcout \u003c\u003c endl;\n\n\t\t\tcout \u003c\u003c \"RESPONSE: \" \u003c\u003c string(entity.begin(), entity.end()) \u003c\u003c endl;\n\n\t\t\tif(this-\u003e_count == 2)\n\t\t\t\tawh-\u003estop();\n\t\t}\n\tpublic:\n\t\tWebClient(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk{};\n\tlog_t log(\u0026fmk);\n\n\tclient::core_t core(\u0026fmk, \u0026log);\n\tclient::awh_t awh(\u0026core, \u0026fmk, \u0026log);\n\n\tWebClient executor(\u0026fmk, \u0026log);\n\n\tcore.proto(awh::engine_t::proto_t::HTTP2);\n\t// core.proto(awh::engine_t::proto_t::HTTP1_1);\n\n\tlog.name(\"WEB Client\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tawh.mode({\n\t\tclient::web_t::flag_t::NOT_INFO,\n\t\tclient::web_t::flag_t::REDIRECTS,\n\t\tclient::web_t::flag_t::CONNECT_METHOD_ENABLE\n\t});\n\n\tnode_t::ssl_t ssl;\n\tssl.verify = true;\n\tssl.ca     = \"./certs/ca.pem\";\n\t// ssl.key  = \"./certs/certificates/client-key.pem\";\n\t// ssl.cert = \"./certs/certificates/client-cert.pem\";\n\tcore.ssl(ssl);\n\n\t// awh.user(\"user\", \"password\");\n\t// awh.authType(auth_t::type_t::BASIC);\n\t// awh.authType(auth_t::type_t::DIGEST, auth_t::hash_t::MD5);\n\n\t// awh.proxy(\"http://user:password@host.com:port\");\n\t// awh.proxy(\"https://user:password@host.com:port\");\n\t// awh.proxy(\"socks5://user:password@host.com:port\");\n\n\t// awh.proxy(client::scheme_t::work_t::ALLOW);\n\t// awh.proxy(client::scheme_t::work_t::DISALLOW);\n\n\t// awh.authTypeProxy(auth_t::type_t::BASIC);\n\t// awh.authTypeProxy(auth_t::type_t::DIGEST, auth_t::hash_t::MD5);\n\n\t/*\n\tawh.compressors({\n\t\thttp_t::compressor_t::ZSTD,\n\t\thttp_t::compressor_t::BROTLI,\n\t\thttp_t::compressor_t::GZIP,\n\t\thttp_t::compressor_t::DEFLATE\n\t});\n\t*/\n\n\tawh.callback \u003cvoid (const client::web_t::mode_t)\u003e (\"active\", std::bind(\u0026WebClient::active, \u0026executor, _1, \u0026awh));\n\tawh.callback \u003cvoid (const int32_t, const uint64_t, const uint32_t, const string \u0026)\u003e (\"response\", std::bind(\u0026WebClient::message, \u0026executor, _1, _2, _3, _4));\n\t// awh.callback \u003cvoid (const int32_t, const uint64_t, const uint32_t, const string \u0026, const unordered_multimap \u003cstring, string\u003e \u0026)\u003e (\"headers\", std::bind(\u0026WebClient::headers, \u0026executor, _1, _2, _3, _4, _5));\n\t// awh.callback \u003cvoid (const int32_t, const uint64_t, const uint32_t, const string \u0026, const vector \u003cchar\u003e \u0026)\u003e (\"entity\", std::bind(\u0026WebClient::entity, \u0026executor, _1, _2, _3, _4, _5, \u0026awh));\n\tawh.callback \u003cvoid (const int32_t, const uint64_t, const uint32_t, const string \u0026, const vector \u003cchar\u003e \u0026, const unordered_multimap \u003cstring, string\u003e \u0026)\u003e (\"complete\", std::bind(\u0026WebClient::complete, \u0026executor, _1, _2, _3, _4, _5, _6, \u0026awh));\n\t\n\tawh.init(\"https://apple.com\");\n\tawh.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example simple WEB-client\n```c++\n#include \u003cclient/awh.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk{};\n\tlog_t log(\u0026fmk);\n\turi_t uri(\u0026fmk);\n\n\tclient::core_t core(\u0026fmk, \u0026log);\n\tclient::awh_t awh(\u0026core, \u0026fmk, \u0026log);\n\n\tcore.proto(awh::engine_t::proto_t::HTTP2);\n\t// core.proto(awh::engine_t::proto_t::HTTP1_1);\n\n\tlog.name(\"WEB Client\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tawh.mode({\n\t\tclient::web_t::flag_t::NOT_INFO,\n\t\tclient::web_t::flag_t::REDIRECTS,\n\t\tclient::web_t::flag_t::CONNECT_METHOD_ENABLE\n\t});\n\n\tnode_t::ssl_t ssl;\n\tssl.verify = true;\n\tssl.ca     = \"./certs/ca.pem\";\n\t// ssl.key  = \"./certs/certificates/client-key.pem\";\n\t// ssl.cert = \"./certs/certificates/client-cert.pem\";\n\tcore.ssl(ssl);\n\n\t// awh.user(\"user\", \"password\");\n\t// awh.authType(auth_t::type_t::BASIC);\n\t// awh.authType(auth_t::type_t::DIGEST, auth_t::hash_t::MD5);\n\n\t// awh.proxy(\"http://user:password@host.com:port\");\n\t// awh.proxy(\"https://user:password@host.com:port\");\n\t// awh.proxy(\"socks5://user:password@host.com:port\");\n\n\t// awh.proxy(client::scheme_t::work_t::ALLOW);\n\t// awh.proxy(client::scheme_t::work_t::DISALLOW);\n\n\t// awh.authTypeProxy(auth_t::type_t::BASIC);\n\t// awh.authTypeProxy(auth_t::type_t::DIGEST, auth_t::hash_t::MD5);\n\n\t/*\n\tawh.compressors({\n\t\thttp_t::compressor_t::ZSTD,\n\t\thttp_t::compressor_t::BROTLI,\n\t\thttp_t::compressor_t::GZIP,\n\t\thttp_t::compressor_t::DEFLATE\n\t});\n\t*/\n\n\turi_t::url_t url = uri.parse(\"https://apple.com/ru/mac\");\n\n\tconst auto \u0026 body = awh.GET(url);\n\t\n\tif(!body.empty())\n\t\tcout \u003c\u003c \"RESPONSE: \" \u003c\u003c string(body.begin(), body.end()) \u003c\u003c endl;\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example WEB-server\n```c++\n#include \u003cserver/awh.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass WebServer {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tprivate:\n\t\tawh::web_t::method_t _method;\n\tpublic:\n\n\t\tstring password(const uint64_t bid, const string \u0026 login){\n\t\t\tthis-\u003e_log-\u003eprint(\"USER: %s, PASS: %s, ID: %zu\", log_t::flag_t::INFO, login.c_str(), \"password\", bid);\n\n\t\t\treturn \"password\";\n\t\t}\n\n\t\tbool auth(const uint64_t bid, const string \u0026 login, const string \u0026 password){\n\t\t\tthis-\u003e_log-\u003eprint(\"USER: %s, PASS: %s, ID: %zu\", log_t::flag_t::INFO, login.c_str(), password.c_str(), bid);\n\n\t\t\treturn true;\n\t\t}\n\tpublic:\n\n\t\tbool accept(const string \u0026 ip, const string \u0026 mac, const uint32_t port){\n\t\t\tthis-\u003e_log-\u003eprint(\"ACCEPT: IP=%s, MAC=%s, PORT=%d\", log_t::flag_t::INFO, ip.c_str(), mac.c_str(), port);\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvoid active(const uint64_t bid, const server::web_t::mode_t mode){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == server::web_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\t\t}\n\n\t\tvoid handshake(const int32_t sid, const uint64_t bid, const server::web_t::agent_t agent, server::awh_t * awh){\n\n\t\t\tif((this-\u003e_method == awh::web_t::method_t::GET) \u0026\u0026 (agent == server::web_t::agent_t::HTTP)){\n\n\t\t\t\tcout \u003c\u003c \"URL: \" \u003c\u003c awh-\u003eparser(sid, bid)-\u003erequest().url \u003c\u003c endl \u003c\u003c endl;\n\t\t\t\n\t\t\t\tconst string body = \"\u003chtml\u003e\\n\u003chead\u003e\\n\u003ctitle\u003eHello World!\u003c/title\u003e\\n\u003c/head\u003e\\n\u003cbody\u003e\\n\"\n\t\t\t\t\"\u003ch1\u003e\\\"Hello, World!\\\" program\u003c/h1\u003e\\n\"\n\t\t\t\t\"\u003cdiv\u003e\\nFrom Wikipedia, the free encyclopedia\u003cbr\u003e\\n\"\n\t\t\t\t\"(Redirected from Hello, world!)\u003cbr\u003e\\n\"\n\t\t\t\t\"Jump to navigationJump to search\u003cbr\u003e\\n\"\n\t\t\t\t\"\u003cstrong\u003e\\\"Hello World\\\"\u003c/strong\u003e redirects here. For other uses, see Hello World (disambiguation).\u003cbr\u003e\\n\"\n\t\t\t\t\"A \u003cstrong\u003e\\\"Hello, World!\\\"\u003c/strong\u003e program generally is a computer program that outputs or displays the message \\\"Hello, World!\\\".\u003cbr\u003e\\n\"\n\t\t\t\t\"Such a program is very simple in most programming languages, and is often used to illustrate the basic syntax of a programming language. It is often the first program written by people learning to code. It can also be used as a sanity test to make sure that computer software intended to compile or run source code is correctly installed, and that the operator understands how to use it.\\n\"\n\t\t\t\t\"\u003c/div\u003e\\n\u003c/body\u003e\\n\u003c/html\u003e\\n\";\n\n\t\t\t\tif(awh-\u003eproto(bid) == engine_t::proto_t::HTTP2){\n\n\t\t\t\t\tvector \u003cpair \u003cstring, string\u003e\u003e headers = {\n\t\t\t\t\t\t{\":method\", \"GET\"},\n\t\t\t\t\t\t{\":scheme\", \"https\"},\n\t\t\t\t\t\t{\":path\", \"/stylesheets/screen.css\"},\n\t\t\t\t\t\t{\":authority\", \"example.com\"},\n\t\t\t\t\t\t{\"accept-encoding\", \"gzip, deflate\"}\n\t\t\t\t\t};\n\n\t\t\t\t\tif(awh-\u003epush2(sid, bid, headers, awh::http2_t::flag_t::NONE) \u003c 0)\n\t\t\t\t\t\tthis-\u003e_log-\u003eprint(\"Push message is not send\", log_t::flag_t::WARNING);\n\t\t\t\t}\n\n\t\t\t\tif(awh-\u003etrailers(sid, bid)){\n\n\t\t\t\t\tawh-\u003etrailer(sid, bid, \"Goga\", \"Hello\");\n\t\t\t\t\tawh-\u003etrailer(sid, bid, \"Hello\", \"World\");\n\t\t\t\t\tawh-\u003etrailer(sid, bid, \"Anyks\", \"Best of the best\");\n\t\t\t\t\tawh-\u003etrailer(sid, bid, \"Checksum\", this-\u003e_fmk-\u003ehash(body, fmk_t::hash_t::MD5));\n\n\t\t\t\t}\n\n\t\t\t\tawh-\u003esend(sid, bid, 200, \"OK\", vector \u003cchar\u003e (body.begin(), body.end()));\n\t\t\t}\n\t\t}\n\n\t\tvoid request(const int32_t sid, const uint64_t bid, const awh::web_t::method_t method, const uri_t::url_t \u0026 url, server::awh_t * awh){\n\t\t\tthis-\u003e_method = method;\n\n\t\t\tif(!url.empty() \u0026\u0026 (!url.path.empty() \u0026\u0026 url.path.back().compare(\"favicon.ico\") == 0))\n\t\t\t\tawh-\u003esend(sid, bid, 404);\n\t\t}\n\n\t\tvoid headers(const int32_t sid, const uint64_t bid, const awh::web_t::method_t method, const uri_t::url_t \u0026 url, const unordered_multimap \u003cstring, string\u003e \u0026 headers){\n\t\t\t(void) sid;\n\t\t\t(void) bid;\n\t\t\t(void) url;\n\t\t\t(void) method;\n\n\t\t\tfor(auto \u0026 header : headers)\n\t\t\t\tcout \u003c\u003c \"HEADER: \" \u003c\u003c header.first \u003c\u003c \": \" \u003c\u003c header.second \u003c\u003c endl;\n\t\t}\n\n\t\tvoid entity(const int32_t sid, const uint64_t bid, const awh::web_t::method_t method, const uri_t::url_t \u0026 url, const vector \u003cchar\u003e \u0026 entity, server::awh_t * awh){\n\t\t\t(void) method;\n\n\t\t\tcout \u003c\u003c \"URL: \" \u003c\u003c url \u003c\u003c endl \u003c\u003c endl;\n\n\t\t\tcout \u003c\u003c \"BODY: \" \u003c\u003c string(entity.begin(), entity.end()) \u003c\u003c endl;\n\n\t\t\tawh-\u003esend(sid, bid, 200, \"OK\", entity, {{\"Connection\", \"close\"}});\n\t\t}\n\n\t\tvoid complete(const int32_t sid, const uint64_t bid, const awh::web_t::method_t method, const uri_t::url_t \u0026 url, const vector \u003cchar\u003e \u0026 entity, const unordered_multimap \u003cstring, string\u003e \u0026 headers, server::awh_t * awh){\n\t\t\t(void) method;\n\n\t\t\tfor(auto \u0026 header : headers)\n\t\t\t\tcout \u003c\u003c \"HEADER: \" \u003c\u003c header.first \u003c\u003c \": \" \u003c\u003c header.second \u003c\u003c endl;\n\n\t\t\tcout \u003c\u003c \"URL: \" \u003c\u003c url \u003c\u003c endl \u003c\u003c endl;\n\n\t\t\tif(!entity.empty()){\n\t\t\t\tcout \u003c\u003c \"BODY: \" \u003c\u003c string(entity.begin(), entity.end()) \u003c\u003c endl;\n\n\t\t\t\tawh-\u003esend(sid, bid, 200, \"OK\", entity, {{\"Connection\", \"close\"}});\n\t\t\t}\n\t\t}\n\tpublic:\n\t\tWebServer(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log), _method(awh::web_t::method_t::NONE) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\n\tserver::core_t core(\u0026fmk, \u0026log);\n\tserver::awh_t awh(\u0026core, \u0026fmk, \u0026log);\n\n\tWebServer executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"WEB Server\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tcore.sonet(awh::scheme_t::sonet_t::TLS);\n\tcore.proto(awh::engine_t::proto_t::HTTP2);\n\t// core.proto(awh::engine_t::proto_t::HTTP1_1);\n\t\n\tcore.cluster(awh::scheme_t::mode_t::ENABLED);\n\n\tnode_t::ssl_t ssl;\n\tssl.verify = false;\n\tssl.key    = \"./certs/certificates/server-key.pem\";\n\tssl.cert   = \"./certs/certificates/server-cert.pem\";\n\tcore.ssl(ssl);\n\n\tawh.clusterAutoRestart(true);\n\n\t// awh.authType(auth_t::type_t::BASIC);\n\tawh.authType(auth_t::type_t::DIGEST, auth_t::hash_t::MD5);\n\n\tawh.init(2222, \"127.0.0.1\", {\n\t\tawh::http_t::compressor_t::ZSTD,\n\t\tawh::http_t::compressor_t::BROTLI,\n\t\tawh::http_t::compressor_t::GZIP,\n\t\tawh::http_t::compressor_t::DEFLATE,\n\t});\n\n\t/*\n\tawh.init(\"anyks\", {\n\t\tawh::http_t::compressor_t::ZSTD,\n\t\tawh::http_t::compressor_t::BROTLI,\n\t\tawh::http_t::compressor_t::GZIP,\n\t\tawh::http_t::compressor_t::DEFLATE,\n\t});\n\t*/\n\n\t// awh.addOrigin(\"example.net\");\n\n\t// awh.addAltSvc(\"example.net\", \"h2=\\\":2222\\\"\");\n\t// awh.addAltSvc(\"example.com\", \"h2=\\\":8000\\\"\");\n\n\tawh.callback \u003cstring (const uint64_t, const string \u0026)\u003e (\"extractPassword\", std::bind(\u0026WebServer::password, \u0026executor, _1, _2));\n\tawh.callback \u003cbool (const uint64_t, const string \u0026, const string \u0026)\u003e (\"checkPassword\", std::bind(\u0026WebServer::auth, \u0026executor, _1, _2, _3));\n\tawh.callback \u003cvoid (const uint64_t, const server::web_t::mode_t)\u003e (\"active\", std::bind(\u0026WebServer::active, \u0026executor, _1, _2));\n\tawh.callback \u003cbool (const string \u0026, const string \u0026, const uint32_t)\u003e (\"accept\", std::bind(\u0026WebServer::accept, \u0026executor, _1, _2, _3));\n\tawh.callback \u003cvoid (const int32_t, const uint64_t, const server::web_t::agent_t)\u003e (\"handshake\", std::bind(\u0026WebServer::handshake, \u0026executor, _1, _2, _3, \u0026awh));\n\tawh.callback \u003cvoid (const int32_t, const uint64_t, const awh::web_t::method_t, const uri_t::url_t \u0026)\u003e (\"request\", std::bind(\u0026WebServer::request, \u0026executor, _1, _2, _3, _4, \u0026awh));\n\t// awh.callback \u003cvoid (const int32_t, const uint64_t, const awh::web_t::method_t, const uri_t::url_t \u0026, const unordered_multimap \u003cstring, string\u003e \u0026)\u003e (\"headers\", std::bind(\u0026WebServer::headers, \u0026executor, _1, _2, _3, _4, _5));\n\t// awh.callback \u003cvoid (const int32_t, const uint64_t, const awh::web_t::method_t, const uri_t::url_t \u0026, const vector \u003cchar\u003e \u0026)\u003e (\"entity\", std::bind(\u0026WebServer::entity, \u0026executor, _1, _2, _3, _4, _5, \u0026awh));\n\tawh.callback \u003cvoid (const int32_t, const uint64_t, const awh::web_t::method_t, const uri_t::url_t \u0026, const vector \u003cchar\u003e \u0026, const unordered_multimap \u003cstring, string\u003e \u0026)\u003e (\"complete\", std::bind(\u0026WebServer::complete, \u0026executor, _1, _2, _3, _4, _5, _6, \u0026awh));\n\n\tawh.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example WebSocket-client\n```c++\n#include \u003cclient/ws.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\nusing namespace awh::client;\n\nclass Executor {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tvoid status(const awh::core_t::status_t status){\n\t\t\tswitch(static_cast \u003cuint8_t\u003e (status)){\n\t\t\t\tcase static_cast \u003cuint8_t\u003e (awh::core_t::status_t::START):\n\t\t\t\t\tthis-\u003e_log-\u003eprint(\"START\", log_t::flag_t::INFO);\n\t\t\t\tbreak;\n\t\t\t\tcase static_cast \u003cuint8_t\u003e (awh::core_t::status_t::STOP):\n\t\t\t\t\tthis-\u003e_log-\u003eprint(\"STOP\", log_t::flag_t::INFO);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tvoid handshake(const int32_t sid, const uint64_t rid, const client::web_t::agent_t agent, client::websocket_t * ws){\n\t\t\t(void) sid;\n\t\t\t(void) rid;\n\n\t\t\tif(agent == client::web_t::agent_t::WEBSOCKET){\n\t\t\t\tthis-\u003e_log-\u003eprint(\"Handshake\", log_t::flag_t::INFO);\n\t\t\t\t\n\t\t\t\tconst string query = \"Hello World!!!\";\n\n\t\t\t\tws-\u003esendMessage(vector \u003cchar\u003e (query.begin(), query.end()));\n\t\t\t}\n\t\t}\n\tpublic:\n\n\t\tvoid error(const uint32_t code, const string \u0026 mess){\n\t\t\tthis-\u003e_log-\u003eprint(\"%s [%u]\", log_t::flag_t::CRITICAL, mess.c_str(), code);\n\t\t}\n\n\t\tvoid message(const vector \u003cchar\u003e \u0026 buffer, const bool utf8, client::websocket_t * ws){\n\t\t\tstring subprotocol = \"\";\n\n\t\t\tconst auto subprotocols = ws-\u003esubprotocols();\n\n\t\t\tif(!subprotocols.empty())\n\t\t\t\tsubprotocol = (* subprotocols.begin());\n\n\t\t\tif(utf8){\n\t\t\t\t\n\t\t\t\tcout \u003c\u003c \"MESSAGE: \" \u003c\u003c string(buffer.begin(), buffer.end()) \u003c\u003c endl;\n\n\t\t\t\tcout \u003c\u003c \"SUB PROTOCOL: \" \u003c\u003c subprotocol \u003c\u003c endl;\n\t\t\t}\n\t\t}\n\tpublic:\n\t\tExecutor(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\n\tclient::core_t core(\u0026fmk, \u0026log);\n\twebsocket_t ws(\u0026core, \u0026fmk, \u0026log);\n\n\tExecutor executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"WebSocket Client\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tws.mode({\n\t\tclient::web_t::flag_t::ALIVE,\n\t\tclient::web_t::flag_t::REDIRECTS,\n\t\tclient::web_t::flag_t::TAKEOVER_CLIENT,\n\t\tclient::web_t::flag_t::TAKEOVER_SERVER,\n\t\tclient::web_t::flag_t::CONNECT_METHOD_ENABLE\n\t});\n\n\tcore.sonet(awh::scheme_t::sonet_t::TLS);\n\tcore.proto(awh::engine_t::proto_t::HTTP2);\n\t// core.proto(awh::engine_t::proto_t::HTTP1_1);\n\n\tnode_t::ssl_t ssl;\n\tssl.verify = false;\n\tssl.key    = \"./certs/certificates/client-key.pem\";\n\tssl.cert   = \"./certs/certificates/client-cert.pem\";\n\tcore.ssl(ssl);\n\n\t// ws.proxy(\"http://user:password@host.com:port\");\n\t// ws.proxy(\"https://user:password@host.com:port\");\n\t// ws.proxy(\"socks5://user:password@host.com:port\");\n\n\t// ws.proxy(client::scheme_t::work_t::ALLOW);\n\t// ws.proxy(client::scheme_t::work_t::DISALLOW);\n\n\t// ws.authTypeProxy(auth_t::type_t::BASIC);\n\t// ws.authTypeProxy(auth_t::type_t::DIGEST, auth_t::hash_t::MD5);\n\t\n\tws.user(\"user\", \"password\");\n\n\t// ws.authType(awh::auth_t::type_t::BASIC);\n\tws.authType(awh::auth_t::type_t::DIGEST, awh::auth_t::hash_t::MD5);\n\n\tws.init(\"wss://127.0.0.1:2222\", {awh::http_t::compressor_t::DEFLATE});\n\n\tws.subprotocols({\"test2\", \"test8\", \"test9\"});\n\t// ws.extensions({{\"test1\", \"test2\", \"test3\"},{\"good1\", \"good2\", \"good3\"}});\n\n\tws.callback \u003cvoid (const awh::core_t::status_t)\u003e (\"status\", std::bind(\u0026Executor::status, \u0026executor, _1));\n\tws.callback \u003cvoid (const uint32_t, const string \u0026)\u003e (\"errorWebsocket\", std::bind(\u0026Executor::error, \u0026executor, _1, _2));\n\tws.callback \u003cvoid (const vector \u003cchar\u003e \u0026, const bool)\u003e (\"messageWebsocket\", std::bind(\u0026Executor::message, \u0026executor, _1, _2, \u0026ws));\n\tws.callback \u003cvoid (const int32_t, const uint64_t, const client::web_t::agent_t)\u003e (\"handshake\", std::bind(\u0026Executor::handshake, \u0026executor, _1, _2, _3, \u0026ws));\n\n\tws.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example WebSocket-server\n```c++\n#include \u003cserver/ws.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\nusing namespace awh::server;\n\nclass Executor {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tstring password(const uint64_t bid, const string \u0026 login){\n\t\t\tthis-\u003e_log-\u003eprint(\"USER: %s, PASS: %s, ID: %zu\", log_t::flag_t::INFO, login.c_str(), \"password\", bid);\n\n\t\t\treturn \"password\";\n\t\t}\n\n\t\tbool auth(const uint64_t bid, const string \u0026 login, const string \u0026 password){\n\t\t\tthis-\u003e_log-\u003eprint(\"USER: %s, PASS: %s, ID: %zu\", log_t::flag_t::INFO, login.c_str(), password.c_str(), bid);\n\n\t\t\treturn true;\n\t\t}\n\tpublic:\n\n\t\tbool accept(const string \u0026 ip, const string \u0026 mac, const uint32_t port){\n\t\t\tthis-\u003e_log-\u003eprint(\"ACCEPT: IP=%s, MAC=%s, PORT=%d\", log_t::flag_t::INFO, ip.c_str(), mac.c_str(), port);\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvoid active(const uint64_t bid, const server::web_t::mode_t mode){\n\t\t\t(void) bid;\n\n\t\t\tswitch(static_cast \u003cuint8_t\u003e (mode)){\n\t\t\t\tcase static_cast \u003cuint8_t\u003e (server::web_t::mode_t::CONNECT):\n\t\t\t\t\tthis-\u003e_log-\u003eprint(\"CONNECT\", log_t::flag_t::INFO);\n\t\t\t\tbreak;\n\t\t\t\tcase static_cast \u003cuint8_t\u003e (server::web_t::mode_t::DISCONNECT):\n\t\t\t\t\tthis-\u003e_log-\u003eprint(\"DISCONNECT\", log_t::flag_t::INFO);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tvoid error(const uint64_t bid, const uint32_t code, const string \u0026 mess){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s [%u]\", log_t::flag_t::CRITICAL, mess.c_str(), code);\n\t\t}\n\n\t\tvoid message(const uint64_t bid, const vector \u003cchar\u003e \u0026 buffer, const bool text, server::websocket_t * ws){\n\t\t\tif(!buffer.empty()){\n\t\t\t\tstring subprotocol = \"\";\n\n\t\t\t\tconst auto subprotocols = ws-\u003esubprotocols(bid);\n\n\t\t\t\tif(!subprotocols.empty())\n\t\t\t\t\tsubprotocol = (* subprotocols.begin());\n\n\t\t\t\tthis-\u003e_log-\u003eprint(\"Message: %s [%s]\", log_t::flag_t::INFO, string(buffer.begin(), buffer.end()).c_str(), subprotocol.c_str());\n\n\t\t\t\tws-\u003esendMessage(bid, buffer, text);\n\t\t\t}\n\t\t}\n\n\t\tvoid headers(const int32_t sid, const uint64_t bid, const awh::web_t::method_t method, const uri_t::url_t \u0026 url, const unordered_multimap \u003cstring, string\u003e \u0026 headers){\n\t\t\t(void) sid;\n\t\t\t(void) bid;\n\t\t\t(void) method;\n\n\t\t\turi_t uri(this-\u003e_fmk);\n\n\t\t\tthis-\u003e_log-\u003eprint(\"REQUEST ID=%zu URL=%s\", log_t::flag_t::INFO, bid, uri.url(url).c_str());\n\n\t\t\tfor(auto \u0026 header : headers)\n\t\t\t\tcout \u003c\u003c \"HEADER: \" \u003c\u003c header.first \u003c\u003c \": \" \u003c\u003c header.second \u003c\u003c endl;\n\t\t}\n\tpublic:\n\t\tExecutor(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\n\tserver::core_t core(\u0026fmk, \u0026log);\n\twebsocket_t ws(\u0026core, \u0026fmk, \u0026log);\n\n\tExecutor executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"WebSocket Server\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tws.mode({\n\t\tserver::web_t::flag_t::TAKEOVER_CLIENT,\n\t\tserver::web_t::flag_t::TAKEOVER_SERVER\n\t});\n\n\tcore.sonet(awh::scheme_t::sonet_t::TLS);\n\tcore.proto(awh::engine_t::proto_t::HTTP2);\n\t// core.proto(awh::engine_t::proto_t::HTTP1_1);\n\n\tcore.cluster(awh::scheme_t::mode_t::ENABLED);\n\n\tnode_t::ssl_t ssl;\n\tssl.verify = false;\n\tssl.key    = \"./certs/certificates/server-key.pem\";\n\tssl.cert   = \"./certs/certificates/server-cert.pem\";\n\tcore.ssl(ssl);\n\n\tws.subprotocols({\"test1\", \"test2\", \"test3\"});\n\n\t// ws.authType(awh::auth_t::type_t::BASIC);\n\tws.authType(awh::auth_t::type_t::DIGEST, awh::auth_t::hash_t::MD5);\n\n\t// ws.init(\"anyks\", {awh::http_t::compressor_t::DEFLATE});\n\t// ws.init(2222, \"\", {awh::http_t::compressor_t::DEFLATE});\n\tws.init(2222, \"127.0.0.1\", {awh::http_t::compressor_t::DEFLATE});\n\n\tws.callback \u003cstring (const uint64_t, const string \u0026)\u003e (\"extractPassword\", std::bind(\u0026Executor::password, \u0026executor, _1, _2));\n\tws.callback \u003cbool (const uint64_t, const string \u0026, const string \u0026)\u003e (\"checkPassword\", std::bind(\u0026Executor::auth, \u0026executor, _1, _2, _3));\n\tws.callback \u003cbool (const string \u0026, const string \u0026, const uint32_t)\u003e (\"accept\", std::bind(\u0026Executor::accept, \u0026executor, _1, _2, _3));\n\tws.callback \u003cvoid (const uint64_t, const server::web_t::mode_t)\u003e (\"active\", std::bind(\u0026Executor::active, \u0026executor, _1, _2));\n\tws.callback \u003cvoid (const uint64_t, const uint32_t, const string \u0026)\u003e (\"errorWebsocket\", std::bind(\u0026Executor::error, \u0026executor, _1, _2, _3));\n\tws.callback \u003cvoid (const uint64_t, const vector \u003cchar\u003e \u0026, const bool)\u003e (\"messageWebsocket\", std::bind(\u0026Executor::message, \u0026executor, _1, _2, _3, \u0026ws));\n\tws.callback \u003cvoid (const int32_t, const uint64_t, const awh::web_t::method_t, const uri_t::url_t \u0026, const unordered_multimap \u003cstring, string\u003e \u0026)\u003e (\"headers\", std::bind(\u0026Executor::headers, \u0026executor, _1, _2, _3, _4, _5));\n\n\tws.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example multiprotocol HTTPS-server\n```c++\n#include \u003cserver/awh.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass WebServer {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tprivate:\n\t\tawh::web_t::method_t _method;\n\tpublic:\n\n\t\tstring password(const uint64_t bid, const string \u0026 login){\n\t\t\tthis-\u003e_log-\u003eprint(\"USER: %s, PASS: %s, ID: %zu\", log_t::flag_t::INFO, login.c_str(), \"password\", bid);\n\n\t\t\treturn \"password\";\n\t\t}\n\n\t\tbool auth(const uint64_t bid, const string \u0026 login, const string \u0026 password){\n\t\t\tthis-\u003e_log-\u003eprint(\"USER: %s, PASS: %s, ID: %zu\", log_t::flag_t::INFO, login.c_str(), password.c_str(), bid);\n\n\t\t\treturn true;\n\t\t}\n\tpublic:\n\n\t\tbool accept(const string \u0026 ip, const string \u0026 mac, const uint32_t port){\n\t\t\tthis-\u003e_log-\u003eprint(\"ACCEPT: IP=%s, MAC=%s, PORT=%d\", log_t::flag_t::INFO, ip.c_str(), mac.c_str(), port);\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvoid active(const uint64_t bid, const server::web_t::mode_t mode){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == server::web_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\t\t}\n\n\t\tvoid error(const uint64_t bid, const uint32_t code, const string \u0026 mess){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s [%u]\", log_t::flag_t::CRITICAL, mess.c_str(), code);\n\t\t}\n\n\t\tvoid message(const uint64_t bid, const vector \u003cchar\u003e \u0026 buffer, const bool text, server::awh_t * awh){\n\t\t\tif(!buffer.empty()){\n\t\t\t\tstring subprotocol = \"\";\n\n\t\t\t\tconst auto subprotocols = awh-\u003esubprotocols(bid);\n\n\t\t\t\tif(!subprotocols.empty())\n\t\t\t\t\tsubprotocol = (* subprotocols.begin());\n\n\t\t\t\tthis-\u003e_log-\u003eprint(\"Message: %s [%s]\", log_t::flag_t::INFO, string(buffer.begin(), buffer.end()).c_str(), subprotocol.c_str());\n\n\t\t\t\tawh-\u003esendMessage(bid, buffer, text);\n\t\t\t}\n\t\t}\n\n\t\tvoid handshake(const int32_t sid, const uint64_t bid, const server::web_t::agent_t agent, server::awh_t * awh){\n\t\t\tif((this-\u003e_method == awh::web_t::method_t::GET) \u0026\u0026 (agent == server::web_t::agent_t::HTTP)){\n\t\t\t\tcout \u003c\u003c \" URL: \" \u003c\u003c awh-\u003eparser(sid, bid)-\u003erequest().url \u003c\u003c endl;\n\n\t\t\t\tconst string body = \"\u003chtml\u003e\\n\u003chead\u003e\\n\u003ctitle\u003eHello World!\u003c/title\u003e\\n\u003c/head\u003e\\n\u003cbody\u003e\\n\"\n\t\t\t\t\"\u003ch1\u003e\\\"Hello, World!\\\" program\u003c/h1\u003e\\n\"\n\t\t\t\t\"\u003cdiv\u003e\\nFrom Wikipedia, the free encyclopedia\u003cbr\u003e\\n\"\n\t\t\t\t\"(Redirected from Hello, world!)\u003cbr\u003e\\n\"\n\t\t\t\t\"Jump to navigationJump to search\u003cbr\u003e\\n\"\n\t\t\t\t\"\u003cstrong\u003e\\\"Hello World\\\"\u003c/strong\u003e redirects here. For other uses, see Hello World (disambiguation).\u003cbr\u003e\\n\"\n\t\t\t\t\"A \u003cstrong\u003e\\\"Hello, World!\\\"\u003c/strong\u003e program generally is a computer program that outputs or displays the message \\\"Hello, World!\\\".\u003cbr\u003e\\n\"\n\t\t\t\t\"Such a program is very simple in most programming languages, and is often used to illustrate the basic syntax of a programming language. It is often the first program written by people learning to code. It can also be used as a sanity test to make sure that computer software intended to compile or run source code is correctly installed, and that the operator understands how to use it.\\n\"\n\t\t\t\t\"\u003c/div\u003e\\n\u003c/body\u003e\\n\u003c/html\u003e\\n\";\n\n\t\t\t\tif(awh-\u003etrailers(sid, bid)){\n\t\t\t\t\tawh-\u003etrailer(sid, bid, \"Goga\", \"Hello\");\n\t\t\t\t\tawh-\u003etrailer(sid, bid, \"Hello\", \"World\");\n\t\t\t\t\tawh-\u003etrailer(sid, bid, \"Anyks\", \"Best of the best\");\n\t\t\t\t\tawh-\u003etrailer(sid, bid, \"Checksum\", this-\u003e_fmk-\u003ehash(body, fmk_t::hash_t::MD5));\n\t\t\t\t}\n\n\t\t\t\tawh-\u003esend(sid, bid, 200, \"OK\", vector \u003cchar\u003e (body.begin(), body.end()));\n\t\t\t}\n\t\t}\n\n\t\tvoid request(const int32_t sid, const uint64_t bid, const awh::web_t::method_t method, const uri_t::url_t \u0026 url, server::awh_t * awh){\n\t\t\tthis-\u003e_method = method;\n\n\t\t\tif(!url.empty() \u0026\u0026 (!url.path.empty() \u0026\u0026 url.path.back().compare(\"favicon.ico\") == 0))\n\t\t\t\tawh-\u003esend(sid, bid, 404);\n\t\t}\n\n\t\tvoid headers(const int32_t sid, const uint64_t bid, const awh::web_t::method_t method, const uri_t::url_t \u0026 url, const unordered_multimap \u003cstring, string\u003e \u0026 headers){\n\t\t\t(void) sid;\n\t\t\t(void) bid;\n\t\t\t(void) method;\n\t\t\t(void) url;\n\n\t\t\tfor(auto \u0026 header : headers)\n\t\t\t\tcout \u003c\u003c \"HEADER: \" \u003c\u003c header.first \u003c\u003c \": \" \u003c\u003c header.second \u003c\u003c endl;\n\t\t}\n\n\t\tvoid entity(const int32_t sid, const uint64_t bid, const awh::web_t::method_t method, const uri_t::url_t \u0026 url, const vector \u003cchar\u003e \u0026 entity, server::awh_t * awh){\n\t\t\t(void) method;\n\n\t\t\tcout \u003c\u003c \"URL: \" \u003c\u003c url \u003c\u003c endl \u003c\u003c endl;\n\n\t\t\tcout \u003c\u003c \"BODY: \" \u003c\u003c string(entity.begin(), entity.end()) \u003c\u003c endl;\n\n\t\t\tawh-\u003esend(sid, bid, 200, \"OK\", entity, {{\"Connection\", \"close\"}});\n\t\t}\n\n\t\tvoid complete(const int32_t sid, const uint64_t bid, const awh::web_t::method_t method, const uri_t::url_t \u0026 url, const vector \u003cchar\u003e \u0026 entity, const unordered_multimap \u003cstring, string\u003e \u0026 headers, server::awh_t * awh){\n\t\t\t(void) method;\n\n\t\t\tfor(auto \u0026 header : headers)\n\t\t\t\tcout \u003c\u003c \"HEADER: \" \u003c\u003c header.first \u003c\u003c \": \" \u003c\u003c header.second \u003c\u003c endl;\n\n\t\t\tcout \u003c\u003c \"URL: \" \u003c\u003c url \u003c\u003c endl \u003c\u003c endl;\n\n\t\t\tif(!entity.empty()){\n\t\t\t\tcout \u003c\u003c \"BODY: \" \u003c\u003c string(entity.begin(), entity.end()) \u003c\u003c endl;\n\n\t\t\t\tawh-\u003esend(sid, bid, 200, \"OK\", entity, {{\"Connection\", \"close\"}});\n\t\t\t}\n\t\t}\n\tpublic:\n\t\tWebServer(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log), _method(awh::web_t::method_t::NONE) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\n\tserver::core_t core(\u0026fmk, \u0026log);\n\tserver::awh_t awh(\u0026core, \u0026fmk, \u0026log);\n\n\tWebServer executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"WEB Server\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tawh.mode({\n\t\tserver::web_t::flag_t::TAKEOVER_CLIENT,\n\t\tserver::web_t::flag_t::TAKEOVER_SERVER,\n\t\tserver::web_t::flag_t::WEBSOCKET_ENABLE,\n\t\tserver::web_t::flag_t::CONNECT_METHOD_ENABLE\n\t});\n\n\tcore.sonet(awh::scheme_t::sonet_t::TLS);\n\tcore.proto(awh::engine_t::proto_t::HTTP2);\n\t// core.proto(awh::engine_t::proto_t::HTTP1_1);\n\n\tcore.cluster(awh::scheme_t::mode_t::ENABLED);\n\n\tnode_t::ssl_t ssl;\n\tssl.verify = false;\n\tssl.key    = \"./certs/certificates/server-key.pem\";\n\tssl.cert   = \"./certs/certificates/server-cert.pem\";\n\tcore.ssl(ssl);\n\n\tawh.clusterAutoRestart(true);\n\n\t// awh.authType(auth_t::type_t::BASIC);\n\tawh.authType(auth_t::type_t::DIGEST, auth_t::hash_t::MD5);\n\n\tawh.init(2222, \"127.0.0.1\", {\n\t\tawh::http_t::compressor_t::ZSTD,\n\t\tawh::http_t::compressor_t::BROTLI,\n\t\tawh::http_t::compressor_t::GZIP,\n\t\tawh::http_t::compressor_t::DEFLATE,\n\t});\n\n\t/*\n\tawh.init(\"anyks\", {\n\t\tawh::http_t::compressor_t::ZSTD,\n\t\tawh::http_t::compressor_t::BROTLI,\n\t\tawh::http_t::compressor_t::GZIP,\n\t\tawh::http_t::compressor_t::DEFLATE,\n\t});\n\t*/\n\n\tawh.addOrigin(\"example.net\");\n\n\tawh.addAltSvc(\"example.net\", \"h2=\\\":2222\\\"\");\n\tawh.addAltSvc(\"example.com\", \"h2=\\\":8000\\\"\");\n\n\tawh.subprotocols({\"test1\", \"test2\", \"test3\"});\n\n\tawh.callback \u003cstring (const uint64_t, const string \u0026)\u003e (\"extractPassword\", std::bind(\u0026WebServer::password, \u0026executor, _1, _2));\n\tawh.callback \u003cbool (const uint64_t, const string \u0026, const string \u0026)\u003e (\"checkPassword\", std::bind(\u0026WebServer::auth, \u0026executor, _1, _2, _3));\n\tawh.callback \u003cvoid (const uint64_t, const server::web_t::mode_t)\u003e (\"active\", std::bind(\u0026WebServer::active, \u0026executor, _1, _2));\n\tawh.callback \u003cbool (const string \u0026, const string \u0026, const uint32_t)\u003e (\"accept\", std::bind(\u0026WebServer::accept, \u0026executor, _1, _2, _3));\n\tawh.callback \u003cvoid (const uint64_t, const uint32_t, const string \u0026)\u003e (\"errorWebsocket\", std::bind(\u0026WebServer::error, \u0026executor, _1, _2, _3));\n\tawh.callback \u003cvoid (const uint64_t, const vector \u003cchar\u003e \u0026, const bool)\u003e (\"messageWebsocket\", std::bind(\u0026WebServer::message, \u0026executor, _1, _2, _3, \u0026awh));\n\tawh.callback \u003cvoid (const int32_t, const uint64_t, const server::web_t::agent_t)\u003e (\"handshake\", std::bind(\u0026WebServer::handshake, \u0026executor, _1, _2, _3, \u0026awh));\n\tawh.callback \u003cvoid (const int32_t, const uint64_t, const awh::web_t::method_t, const uri_t::url_t \u0026)\u003e (\"request\", std::bind(\u0026WebServer::request, \u0026executor, _1, _2, _3, _4, \u0026awh));\n\t// awh.callback \u003cvoid (const int32_t, const uint64_t, const awh::web_t::method_t, const uri_t::url_t \u0026, const vector \u003cchar\u003e \u0026)\u003e (\"entity\", std::bind(\u0026WebServer::entity, \u0026executor, _1, _2, _3, _4, _5, \u0026awh));\n\t// awh.callback \u003cvoid (const int32_t, const uint64_t, const awh::web_t::method_t, const uri_t::url_t \u0026, const unordered_multimap \u003cstring, string\u003e \u0026)\u003e (\"headers\", std::bind(\u0026WebServer::headers, \u0026executor, _1, _2, _3, _4, _5));\n\tawh.callback \u003cvoid (const int32_t, const uint64_t, const awh::web_t::method_t, const uri_t::url_t \u0026, const vector \u003cchar\u003e \u0026, const unordered_multimap \u003cstring, string\u003e \u0026)\u003e (\"complete\", std::bind(\u0026WebServer::complete, \u0026executor, _1, _2, _3, _4, _5, _6, \u0026awh));\n\n\tawh.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example HTTPS PROXY-server\n```c++\n#include \u003cserver/proxy.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Proxy {\n\tprivate:\n\t\tlog_t * _log;\n\tpublic:\n\n\t\tstring password(const uint64_t bid, const string \u0026 login){\n\t\t\tthis-\u003e_log-\u003eprint(\"USER: %s, PASS: %s\", log_t::flag_t::INFO, login.c_str(), \"password\");\n\n\t\t\treturn \"password\";\n\t\t}\n\n\t\tbool auth(const uint64_t bid, const string \u0026 login, const string \u0026 password){\n\t\t\tthis-\u003e_log-\u003eprint(\"USER: %s, PASS: %s\", log_t::flag_t::INFO, login.c_str(), password.c_str());\n\n\t\t\treturn true;\n\t\t}\n\tpublic:\n\t\tbool accept(const string \u0026 ip, const string \u0026 mac, const uint32_t port){\n\t\t\tthis-\u003e_log-\u003eprint(\"ACCEPT: ip = %s, mac = %s, port = %d\", log_t::flag_t::INFO, ip.c_str(), mac.c_str(), port);\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvoid active(const uint64_t bid, const server::proxy_t::broker_t broker, const server::web_t::mode_t mode){\n\t\t\t(void) bid;\n\n\t\t\tswitch(static_cast \u003cuint8_t\u003e (broker)){\n\t\t\t\tcase static_cast \u003cuint8_t\u003e (server::proxy_t::broker_t::CLIENT):\n\t\t\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == server::web_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\t\t\t\tbreak;\n\t\t\t\tcase static_cast \u003cuint8_t\u003e (server::proxy_t::broker_t::SERVER):\n\t\t\t\t\tthis-\u003e_log-\u003eprint(\"%s server\", log_t::flag_t::INFO, (mode == server::web_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\tpublic:\n\t\tProxy(log_t * log) : _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\n\tProxy executor(\u0026log);\n\tserver::proxy_t proxy(\u0026fmk, \u0026log);\n\n\tlog.name(\"Proxy Server\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tproxy.cluster(awh::scheme_t::mode_t::ENABLED);\n\n\tnode_t::ssl_t ssl;\n\tssl.verify = false;\n\tssl.ca     = \"./certs/ca.pem\";\n\tssl.key    = \"./certs/certificates/server-key.pem\";\n\tssl.cert   = \"./certs/certificates/server-cert.pem\";\n\tproxy.ssl(ssl);\n\n\tproxy.mode({\n\t\tserver::proxy_t::flag_t::SYNCPROTO,\n\t\tserver::proxy_t::flag_t::REDIRECTS,\n\t\tserver::proxy_t::flag_t::CONNECT_METHOD_SERVER_ENABLE\n\t});\n\n\tproxy.hosts(server::proxy_t::broker_t::CLIENT, \"/etc/hosts\");\n\n\t// proxy.authType(server::proxy_t::broker_t::SERVER, auth_t::type_t::BASIC);\n\t// proxy.authType(server::proxy_t::broker_t::SERVER, auth_t::type_t::DIGEST, auth_t::hash_t::SHA512);\n\tproxy.authType(server::proxy_t::broker_t::SERVER, auth_t::type_t::DIGEST, auth_t::hash_t::MD5);\n\n\t// proxy.init(\"anyks\", http_t::compressor_t::GZIP);\n\t// proxy.init(2222, \"\", http_t::compressor_t::GZIP);\n\tproxy.init(2222, \"127.0.0.1\", http_t::compressor_t::GZIP);\n\n\tproxy.callback \u003cstring (const uint64_t, const string \u0026)\u003e (\"extractPassword\", std::bind(\u0026Proxy::password, \u0026executor, _1, _2));\n\tproxy.callback \u003cbool (const uint64_t, const string \u0026, const string \u0026)\u003e (\"checkPassword\", std::bind(\u0026Proxy::auth, \u0026executor, _1, _2, _3));\n\tproxy.callback \u003cbool (const string \u0026, const string \u0026, const uint32_t)\u003e (\"accept\", std::bind(\u0026Proxy::accept, \u0026executor, _1, _2, _3));\n\tproxy.callback \u003cvoid (const uint64_t, const server::proxy_t::broker_t, const server::web_t::mode_t)\u003e (\"active\", std::bind(\u0026Proxy::active, \u0026executor, _1, _2, _3));\n\n\tproxy.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example Socks5 PROXY-server\n```c++\n#include \u003cserver/socks5.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\nusing namespace server;\n\nclass Proxy {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tbool auth(const uint64_t bid, const string \u0026 login, const string \u0026 password){\n\t\t\tthis-\u003e_log-\u003eprint(\"USER: %s, PASS: %s, ID: %zu\", log_t::flag_t::INFO, login.c_str(), password.c_str(), bid);\n\n\t\t\treturn true;\n\t\t}\n\tpublic:\n\n\t\tbool accept(const string \u0026 ip, const string \u0026 mac, const uint32_t port){\n\t\t\tthis-\u003e_log-\u003eprint(\"ACCEPT: ip = %s, mac = %s, port = %d\", log_t::flag_t::INFO, ip.c_str(), mac.c_str(), port);\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvoid active(const uint64_t bid, const proxy_socks5_t::mode_t mode){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == proxy_socks5_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\t\t}\n\tpublic:\n\t\tProxy(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\n\tproxy_socks5_t proxy(\u0026fmk, \u0026log);\n\tProxy executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"Proxy Socks5 Server\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tnode_t::ssl_t ssl;\n\tssl.verify = true;\n\tssl.ca     = \"./certs/ca.pem\";\n\tproxy.ssl(ssl);\n\n\tproxy.sonet(awh::scheme_t::sonet_t::TCP);\n\n\tproxy.cluster(awh::scheme_t::mode_t::ENABLED);\n\n\t// proxy.init(\"anyks\");\n\t// proxy.init(2222);\n\tproxy.init(2222, \"127.0.0.1\");\n\n\tproxy.callback \u003cvoid (const size_t, const proxy_socks5_t::mode_t)\u003e (\"active\", std::bind(\u0026Proxy::active, \u0026executor, _1, _2));\n\tproxy.callback \u003cbool (const string \u0026, const string \u0026, const uint32_t)\u003e (\"accept\", std::bind(\u0026Proxy::accept, \u0026executor, _1, _2, _3));\n\t// proxy.callback \u003cbool (const uint64_t, const string \u0026, const string \u0026)\u003e (\"checkPassword\", std::bind(\u0026Proxy::auth, \u0026executor, _1, _2, _3));\n\n\tproxy.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example Timer\n```c++\n#include \u003cchrono\u003e\n#include \u003ccore/timer.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Executor {\n\tprivate:\n\t\tchrono::time_point \u003cchrono::system_clock\u003e _ts;\n\t\tchrono::time_point \u003cchrono::system_clock\u003e _is;\n\tprivate:\n\t\tuint16_t _count;\n\tprivate:\n\t\tlog_t * _log;\n\tpublic:\n\n\t\tvoid interval(const uint16_t tid, awh::timer_t * timer){\n\t\t\tauto shift = chrono::system_clock::now();\n\n\t\t\tthis-\u003e_log-\u003eprint(\"Interval: %u seconds\", log_t::flag_t::INFO, chrono::duration_cast \u003cchrono::seconds\u003e (shift - this-\u003e_is).count());\n\n\t\t\tthis-\u003e_is = shift;\n\n\t\t\tif((this-\u003e_count++) \u003e= 10){\n\t\t\t\ttimer-\u003eclear(tid);\n\t\t\t\ttimer-\u003estop();\n\t\t\t}\n\t\t}\n\n\t\tvoid timeout(const uint16_t id){\n\t\t\tthis-\u003e_log-\u003eprint(\"Timeout: %u seconds\", log_t::flag_t::INFO, chrono::duration_cast \u003cchrono::seconds\u003e (chrono::system_clock::now() - this-\u003e_ts).count());\n\t\t}\n\n\t\tvoid launched(const awh::core_t::status_t status, awh::timer_t * timer){\n\t\t\tswitch(static_cast \u003cuint8_t\u003e (status)){\n\t\t\t\tcase static_cast \u003cuint8_t\u003e (awh::core_t::status_t::START): {\n\t\t\t\t\tthis-\u003e_ts = chrono::system_clock::now();\n\t\t\t\t\tthis-\u003e_is = this-\u003e_ts;\n\n\t\t\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, \"Start timer\");\n\n\t\t\t\t\tuint16_t tid = timer-\u003etimeout(10000);\n\n\t\t\t\t\ttimer-\u003eset \u003cvoid (const uint16_t)\u003e (tid, std::bind(\u0026Executor::timeout, this, tid));\n\n\t\t\t\t\ttid = timer-\u003einterval(5000);\n\n\t\t\t\t\ttimer-\u003eset \u003cvoid (const uint16_t, awh::timer_t *)\u003e (tid, std::bind(\u0026Executor::interval, this, tid, timer));\n\t\t\t\t} break;\n\t\t\t\tcase static_cast \u003cuint8_t\u003e (awh::core_t::status_t::STOP):\n\t\t\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, \"Stop timer\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\tpublic:\n\t\tExecutor(log_t * log) : _ts(chrono::system_clock::now()), _is(chrono::system_clock::now()), _count(0), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\n\tExecutor executor(\u0026log);\n\n\tawh::timer_t timer(\u0026fmk, \u0026log);\n\n\tlog.name(\"Timer\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\ttimer.callback \u003cvoid (const awh::core_t::status_t)\u003e (\"status\", std::bind(\u0026Executor::launched, \u0026executor, _1, \u0026timer));\n\ttimer.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example DNS-resolver\n```c++\n#include \u003cnet/dns.hpp\u003e\n#include \u003ccore/core.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\tcore_t core(\u0026fmk, \u0026log);\n\n\tlog.name(\"DNS\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tdns.prefix(\"AWH\");\n\n\tdns.servers({\"77.88.8.88\", \"77.88.8.2\"});\n\n\tlog.print(\"IP1: %s\", log_t::flag_t::INFO, dns.resolve(\"localhost\").c_str());\n\tlog.print(\"IP2: %s\", log_t::flag_t::INFO, dns.resolve(\"yandex.ru\").c_str());\n\tlog.print(\"IP3: %s\", log_t::flag_t::INFO, dns.resolve(\"google.com\").c_str());\n\n\tlog.print(\"IP4: %s\", log_t::flag_t::INFO, dns.resolve(\"stalin.info\").c_str());\n\n\tconst auto \u0026 yandex = dns.search(\"77.88.55.60\");\n\tif(!yandex.empty()){\n\t\tfor(auto \u0026 domain : yandex)\n\t\t\tlog.print(\"Domain: %s =\u003e %s\", log_t::flag_t::INFO, domain.c_str(), \"77.88.55.60\");\n\t}\n\t\n\tlog.print(\"Encode domain \\\"ремпрофи.рф\\\" == \\\"%s\\\"\", log_t::flag_t::INFO, dns.encode(\"ремпрофи.рф\").c_str());\n\tlog.print(\"Decode domain \\\"xn--e1agliedd7a.xn--p1ai\\\" == \\\"%s\\\"\", log_t::flag_t::INFO, dns.decode(\"xn--e1agliedd7a.xn--p1ai\").c_str());\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example NTP-client\n```c++\n#include \u003cnet/ntp.hpp\u003e\n#include \u003ccore/core.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tntp_t ntp(\u0026fmk, \u0026log);\n\tcore_t core(\u0026fmk, \u0026log);\n\n\tlog.name(\"NTP\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tntp.ns({\"77.88.8.88\", \"77.88.8.2\"});\n\n\tntp.servers({\"0.ru.pool.ntp.org\", \"1.ru.pool.ntp.org\", \"2.ru.pool.ntp.org\", \"3.ru.pool.ntp.org\"});\n\n\tlog.print(\"Time: %s\", log_t::flag_t::INFO, fmk.time2str((ntp.request() / 1000), \"%H:%M:%S %d.%m.%Y\").c_str());\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example ICMP-client PINGER\n```c++\n#include \u003cnet/ping.hpp\u003e\n#include \u003ccore/core.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tcore_t core(\u0026fmk, \u0026log);\n\tping_t ping(\u0026fmk, \u0026log);\n\n\tlog.name(\"PING\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tconst double result = ping.ping(\"api.telegram.org\", 10);\n\n\tlog.print(\"PING result=%f\", log_t::flag_t::INFO, result);\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example TCP-client\n```c++\n#include \u003cclient/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Client {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tvoid active(const client::sample_t::mode_t mode, client::sample_t * sample){\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == client::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\n\t\t\tif(mode == client::sample_t::mode_t::CONNECT){\n\t\t\t\tconst string message = \"Hello World!!!\";\n\n\t\t\t\tsample-\u003esend(message.data(), message.size());\n\t\t\t}\n\t\t}\n\n\t\tvoid message(const vector \u003cchar\u003e \u0026 buffer, client::sample_t * sample){\n\t\t\tconst string message(buffer.begin(), buffer.end());\n\t\t\t\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, message.c_str());\n\t\t\t\n\t\t\tsample-\u003estop();\n\t\t}\n\tpublic:\n\t\tClient(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tclient::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tclient::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\tClient executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"TCP Client\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\t// sample.mode({client::sample_t::flag_t::NOT_INFO});\n\n\tcore.sonet(awh::scheme_t::sonet_t::TCP);\n\n\tsample.init(2222, \"127.0.0.1\");\n\n\tsample.callback \u003cvoid (const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Client::message, \u0026executor, _1, \u0026sample));\n\tsample.callback \u003cvoid (const client::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Client::active, \u0026executor, _1, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example TCP-server\n```c++\n#include \u003cserver/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Server {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tbool accept(const string \u0026 ip, const string \u0026 mac, const uint32_t port){\n\t\t\tthis-\u003e_log-\u003eprint(\"ACCEPT: ip = %s, mac = %s, port = %d\", log_t::flag_t::INFO, ip.c_str(), mac.c_str(), port);\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvoid active(const uint64_t bid, const server::sample_t::mode_t mode){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == server::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\t\t}\n\n\t\tvoid message(const uint64_t bid, const vector \u003cchar\u003e \u0026 buffer, server::sample_t * sample){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, string(buffer.begin(), buffer.end()).c_str());\n\n\t\t\tsample-\u003esend(bid, buffer.data(), buffer.size());\n\t\t}\n\tpublic:\n\t\tServer(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tserver::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tserver::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\n\tServer executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"SAMPLE Server\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tcore.sonet(awh::scheme_t::sonet_t::TCP);\n\tcore.cluster(awh::scheme_t::mode_t::ENABLED);\n\n\tsample.init(2222, \"127.0.0.1\");\n\n\tsample.callback \u003cvoid (const uint64_t, const server::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Server::active, \u0026executor, _1, _2));\n\tsample.callback \u003cbool (const string \u0026, const string \u0026, const uint32_t)\u003e (\"accept\", std::bind(\u0026Server::accept, \u0026executor, _1, _2, _3));\n\tsample.callback \u003cvoid (const uint64_t, const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Server::message, \u0026executor, _1, _2, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example TLS-client\n```c++\n#include \u003cclient/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Client {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tvoid active(const client::sample_t::mode_t mode, client::sample_t * sample){\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == client::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\n\t\t\tif(mode == client::sample_t::mode_t::CONNECT){\n\t\t\t\tconst string message = \"Hello World!!!\";\n\n\t\t\t\tsample-\u003esend(message.data(), message.size());\n\t\t\t}\n\t\t}\n\n\t\tvoid message(const vector \u003cchar\u003e \u0026 buffer, client::sample_t * sample){\n\t\t\tconst string message(buffer.begin(), buffer.end());\n\t\t\t\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, message.c_str());\n\t\t\t\n\t\t\tsample-\u003estop();\n\t\t}\n\tpublic:\n\t\tClient(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tclient::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tclient::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\tClient executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"TLS Client\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\t// sample.mode({client::sample_t::flag_t::NOT_INFO});\n\n\tcore.sonet(awh::scheme_t::sonet_t::TLS);\n\n\tnode_t::ssl_t ssl;\n\tssl.verify = false;\n\tssl.key    = \"./certs/certificates/client-key.pem\";\n\tssl.cert   = \"./certs/certificates/client-cert.pem\";\n\tcore.ssl(ssl);\n\n\tsample.init(2222, \"127.0.0.1\");\n\n\tsample.callback \u003cvoid (const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Client::message, \u0026executor, _1, \u0026sample));\n\tsample.callback \u003cvoid (const client::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Client::active, \u0026executor, _1, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example TLS-server\n```c++\n#include \u003cserver/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Server {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tbool accept(const string \u0026 ip, const string \u0026 mac, const uint32_t port){\n\t\t\tthis-\u003e_log-\u003eprint(\"ACCEPT: ip = %s, mac = %s, port = %d\", log_t::flag_t::INFO, ip.c_str(), mac.c_str(), port);\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvoid active(const uint64_t bid, const server::sample_t::mode_t mode){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == server::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\t\t}\n\n\t\tvoid message(const uint64_t bid, const vector \u003cchar\u003e \u0026 buffer, server::sample_t * sample){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, string(buffer.begin(), buffer.end()).c_str());\n\n\t\t\tsample-\u003esend(bid, buffer.data(), buffer.size());\n\t\t}\n\tpublic:\n\t\tServer(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tserver::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tserver::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\n\tServer executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"TLS Server\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tcore.sonet(awh::scheme_t::sonet_t::TLS);\n\tcore.cluster(awh::scheme_t::mode_t::ENABLED);\n\n\tnode_t::ssl_t ssl;\n\tssl.verify = false;\n\tssl.key    = \"./certs/certificates/server-key.pem\";\n\tssl.cert   = \"./certs/certificates/server-cert.pem\";\n\tcore.ssl(ssl);\n\n\tsample.init(2222, \"127.0.0.1\");\n\n\tsample.callback \u003cvoid (const uint64_t, const server::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Server::active, \u0026executor, _1, _2));\n\tsample.callback \u003cbool (const string \u0026, const string \u0026, const uint32_t)\u003e (\"accept\", std::bind(\u0026Server::accept, \u0026executor, _1, _2, _3));\n\tsample.callback \u003cvoid (const uint64_t, const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Server::message, \u0026executor, _1, _2, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example UDP-client\n```c++\n#include \u003cclient/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Client {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tvoid active(const client::sample_t::mode_t mode, client::sample_t * sample){\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == client::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\n\t\t\tif(mode == client::sample_t::mode_t::CONNECT){\n\t\t\t\tconst string message = \"Hello World!!!\";\n\n\t\t\t\tsample-\u003esend(message.data(), message.size());\n\t\t\t}\n\t\t}\n\n\t\tvoid message(const vector \u003cchar\u003e \u0026 buffer, client::sample_t * sample){\n\t\t\tconst string message(buffer.begin(), buffer.end());\n\t\t\t\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, message.c_str());\n\t\t\t\n\t\t\tsample-\u003estop();\n\t\t}\n\tpublic:\n\t\tClient(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tclient::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tclient::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\tClient executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"UDP Client\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\t// sample.mode({client::sample_t::flag_t::NOT_INFO});\n\n\tcore.sonet(awh::scheme_t::sonet_t::UDP);\n\n\tsample.init(2222, \"127.0.0.1\");\n\n\tsample.callback \u003cvoid (const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Client::message, \u0026executor, _1, \u0026sample));\n\tsample.callback \u003cvoid (const client::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Client::active, \u0026executor, _1, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example UDP-server\n```c++\n#include \u003cserver/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Server {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tbool accept(const string \u0026 ip, const string \u0026 mac, const uint32_t port){\n\t\t\tthis-\u003e_log-\u003eprint(\"ACCEPT: ip = %s, mac = %s, port = %d\", log_t::flag_t::INFO, ip.c_str(), mac.c_str(), port);\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvoid active(const uint64_t bid, const server::sample_t::mode_t mode){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == server::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\t\t}\n\n\t\tvoid message(const uint64_t bid, const vector \u003cchar\u003e \u0026 buffer, server::sample_t * sample){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, string(buffer.begin(), buffer.end()).c_str());\n\n\t\t\tsample-\u003esend(bid, buffer.data(), buffer.size());\n\t\t}\n\tpublic:\n\t\tServer(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tserver::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tserver::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\n\tServer executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"UDP Server\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tcore.sonet(awh::scheme_t::sonet_t::UDP);\n\n\tsample.init(2222, \"127.0.0.1\");\n\n\tsample.callback \u003cvoid (const uint64_t, const server::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Server::active, \u0026executor, _1, _2));\n\tsample.callback \u003cbool (const string \u0026, const string \u0026, const uint32_t)\u003e (\"accept\", std::bind(\u0026Server::accept, \u0026executor, _1, _2, _3));\n\tsample.callback \u003cvoid (const uint64_t, const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Server::message, \u0026executor, _1, _2, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example SCTP-client\n```c++\n#include \u003cclient/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Client {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tvoid active(const client::sample_t::mode_t mode, client::sample_t * sample){\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == client::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\n\t\t\tif(mode == client::sample_t::mode_t::CONNECT){\n\t\t\t\tconst string message = \"Hello World!!!\";\n\n\t\t\t\tsample-\u003esend(message.data(), message.size());\n\t\t\t}\n\t\t}\n\n\t\tvoid message(const vector \u003cchar\u003e \u0026 buffer, client::sample_t * sample){\n\t\t\tconst string message(buffer.begin(), buffer.end());\n\t\t\t\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, message.c_str());\n\t\t\t\n\t\t\tsample-\u003estop();\n\t\t}\n\tpublic:\n\t\tClient(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tclient::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tclient::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\tClient executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"SCTP Client\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\t// sample.mode({client::sample_t::flag_t::NOT_INFO});\n\n\tcore.sonet(awh::scheme_t::sonet_t::SCTP);\n\t\n\tnode_t::ssl_t ssl;\n\tssl.verify = false;\n\tssl.key    = \"./certs/certificates/client-key.pem\";\n\tssl.cert   = \"./certs/certificates/client-cert.pem\";\n\tcore.ssl(ssl);\n\n\tsample.init(2222, \"127.0.0.1\");\n\n\tsample.callback \u003cvoid (const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Client::message, \u0026executor, _1, \u0026sample));\n\tsample.callback \u003cvoid (const client::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Client::active, \u0026executor, _1, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example SCTP-server\n```c++\n#include \u003cserver/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Server {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tbool accept(const string \u0026 ip, const string \u0026 mac, const uint32_t port){\n\t\t\tthis-\u003e_log-\u003eprint(\"ACCEPT: ip = %s, mac = %s, port = %d\", log_t::flag_t::INFO, ip.c_str(), mac.c_str(), port);\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvoid active(const uint64_t bid, const server::sample_t::mode_t mode){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == server::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\t\t}\n\n\t\tvoid message(const uint64_t bid, const vector \u003cchar\u003e \u0026 buffer, server::sample_t * sample){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, string(buffer.begin(), buffer.end()).c_str());\n\n\t\t\tsample-\u003esend(bid, buffer.data(), buffer.size());\n\t\t}\n\tpublic:\n\t\tServer(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tserver::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tserver::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\n\tServer executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"SCTP Server\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tcore.sonet(awh::scheme_t::sonet_t::SCTP);\n\tcore.cluster(awh::scheme_t::mode_t::ENABLED);\n\n\tnode_t::ssl_t ssl;\n\tssl.verify = false;\n\tssl.key    = \"./certs/certificates/server-key.pem\";\n\tssl.cert   = \"./certs/certificates/server-cert.pem\";\n\tcore.ssl(ssl);\n\n\tsample.init(2222, \"127.0.0.1\");\n\n\tsample.callback \u003cvoid (const uint64_t, const server::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Server::active, \u0026executor, _1, _2));\n\tsample.callback \u003cbool (const string \u0026, const string \u0026, const uint32_t)\u003e (\"accept\", std::bind(\u0026Server::accept, \u0026executor, _1, _2, _3));\n\tsample.callback \u003cvoid (const uint64_t, const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Server::message, \u0026executor, _1, _2, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example DTLS-client\n```c++\n#include \u003cclient/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Client {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tvoid active(const client::sample_t::mode_t mode, client::sample_t * sample){\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == client::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\n\t\t\tif(mode == client::sample_t::mode_t::CONNECT){\n\t\t\t\tconst string message = \"Hello World!!!\";\n\n\t\t\t\tsample-\u003esend(message.data(), message.size());\n\t\t\t}\n\t\t}\n\n\t\tvoid message(const vector \u003cchar\u003e \u0026 buffer, client::sample_t * sample){\n\t\t\tconst string message(buffer.begin(), buffer.end());\n\t\t\t\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, message.c_str());\n\t\t\t\n\t\t\tsample-\u003estop();\n\t\t}\n\tpublic:\n\t\tClient(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tclient::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tclient::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\tClient executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"DTLS Client\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\t// sample.mode({client::sample_t::flag_t::NOT_INFO});\n\n\tcore.sonet(awh::scheme_t::sonet_t::DTLS);\n\n\tnode_t::ssl_t ssl;\n\tssl.verify = false;\n\tssl.key    = \"./certs/certificates/client-key.pem\";\n\tssl.cert   = \"./certs/certificates/client-cert.pem\";\n\tcore.ssl(ssl);\n\n\tsample.init(2222, \"127.0.0.1\");\n\n\tsample.callback \u003cvoid (const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Client::message, \u0026executor, _1, \u0026sample));\n\tsample.callback \u003cvoid (const client::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Client::active, \u0026executor, _1, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example DTLS-server\n```c++\n#include \u003cserver/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Server {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tbool accept(const string \u0026 ip, const string \u0026 mac, const uint32_t port){\n\t\t\tthis-\u003e_log-\u003eprint(\"ACCEPT: ip = %s, mac = %s, port = %d\", log_t::flag_t::INFO, ip.c_str(), mac.c_str(), port);\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvoid active(const uint64_t bid, const server::sample_t::mode_t mode){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == server::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\t\t}\n\n\t\tvoid message(const uint64_t bid, const vector \u003cchar\u003e \u0026 buffer, server::sample_t * sample){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, string(buffer.begin(), buffer.end()).c_str());\n\n\t\t\tsample-\u003esend(bid, buffer.data(), buffer.size());\n\t\t}\n\tpublic:\n\t\tServer(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tserver::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tserver::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\n\tServer executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"DTLS Server\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tcore.sonet(awh::scheme_t::sonet_t::DTLS);\n\n\tnode_t::ssl_t ssl;\n\tssl.verify = false;\n\tssl.key    = \"./certs/certificates/server-key.pem\";\n\tssl.cert   = \"./certs/certificates/server-cert.pem\";\n\tcore.ssl(ssl);\n\n\tsample.init(2222, \"127.0.0.1\");\n\n\tsample.callback \u003cvoid (const uint64_t, const server::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Server::active, \u0026executor, _1, _2));\n\tsample.callback \u003cbool (const string \u0026, const string \u0026, const uint32_t)\u003e (\"accept\", std::bind(\u0026Server::accept, \u0026executor, _1, _2, _3));\n\tsample.callback \u003cvoid (const uint64_t, const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Server::message, \u0026executor, _1, _2, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example UnixSocket TCP-client\n```c++\n#include \u003cclient/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Client {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tvoid active(const client::sample_t::mode_t mode, client::sample_t * sample){\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == client::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\n\t\t\tif(mode == client::sample_t::mode_t::CONNECT){\n\t\t\t\tconst string message = \"Hello World!!!\";\n\n\t\t\t\tsample-\u003esend(message.data(), message.size());\n\t\t\t}\n\t\t}\n\n\t\tvoid message(const vector \u003cchar\u003e \u0026 buffer, client::sample_t * sample){\n\t\t\tconst string message(buffer.begin(), buffer.end());\n\t\t\t\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, message.c_str());\n\t\t\t\n\t\t\tsample-\u003estop();\n\t\t}\n\tpublic:\n\t\tClient(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tclient::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tclient::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\tClient executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"UnixSocket Client\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\t// sample.mode({client::sample_t::flag_t::NOT_INFO});\n\t\n\tcore.sonet(awh::scheme_t::sonet_t::TCP);\n\tcore.family(awh::scheme_t::family_t::NIX);\n\n\tsample.init(\"anyks\");\n\n\tsample.callback \u003cvoid (const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Client::message, \u0026executor, _1, \u0026sample));\n\tsample.callback \u003cvoid (const client::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Client::active, \u0026executor, _1, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example UnixSocket TCP-server\n```c++\n#include \u003cserver/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Server {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tbool accept(const string \u0026 ip, const string \u0026 mac, const uint32_t port){\n\t\t\tthis-\u003e_log-\u003eprint(\"ACCEPT: ip = %s, mac = %s, port = %d\", log_t::flag_t::INFO, ip.c_str(), mac.c_str(), port);\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvoid active(const uint64_t bid, const server::sample_t::mode_t mode){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == server::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\t\t}\n\n\t\tvoid message(const uint64_t bid, const vector \u003cchar\u003e \u0026 buffer, server::sample_t * sample){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, string(buffer.begin(), buffer.end()).c_str());\n\n\t\t\tsample-\u003esend(bid, buffer.data(), buffer.size());\n\t\t}\n\tpublic:\n\t\tServer(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tserver::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tserver::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\n\tServer executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"UnixSocket Server\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tcore.sonet(awh::scheme_t::sonet_t::TCP);\n\tcore.family(awh::scheme_t::family_t::NIX);\n\tcore.cluster(awh::scheme_t::mode_t::ENABLED);\n\n\tsample.init(\"anyks\");\n\n\tsample.callback \u003cvoid (const uint64_t, const server::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Server::active, \u0026executor, _1, _2));\n\tsample.callback \u003cbool (const string \u0026, const string \u0026, const uint32_t)\u003e (\"accept\", std::bind(\u0026Server::accept, \u0026executor, _1, _2, _3));\n\tsample.callback \u003cvoid (const uint64_t, const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Server::message, \u0026executor, _1, _2, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example UnixSocket UDP-client\n```c++\n#include \u003cclient/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Client {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tvoid active(const client::sample_t::mode_t mode, client::sample_t * sample){\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == client::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\n\t\t\tif(mode == client::sample_t::mode_t::CONNECT){\n\t\t\t\tconst string message = \"Hello World!!!\";\n\n\t\t\t\tsample-\u003esend(message.data(), message.size());\n\t\t\t}\n\t\t}\n\n\t\tvoid message(const vector \u003cchar\u003e \u0026 buffer, client::sample_t * sample){\n\t\t\tconst string message(buffer.begin(), buffer.end());\n\t\t\t\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, message.c_str());\n\t\t\t\n\t\t\tsample-\u003estop();\n\t\t}\n\tpublic:\n\t\tClient(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tclient::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tclient::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\tClient executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"UDP UnixSocket Client\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\t// sample.mode({client::sample_t::flag_t::NOT_INFO});\n\t\n\tcore.sonet(awh::scheme_t::sonet_t::UDP);\n\tcore.family(awh::scheme_t::family_t::NIX);\n\n\tsample.init(\"anyks\");\n\n\tsample.callback \u003cvoid (const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Client::message, \u0026executor, _1, \u0026sample));\n\tsample.callback \u003cvoid (const client::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Client::active, \u0026executor, _1, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example UnixSocket UDP-server\n```c++\n#include \u003cserver/sample.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Server {\n\tprivate:\n\t\tconst fmk_t * _fmk;\n\t\tconst log_t * _log;\n\tpublic:\n\n\t\tbool accept(const string \u0026 ip, const string \u0026 mac, const uint32_t port){\n\t\t\tthis-\u003e_log-\u003eprint(\"ACCEPT: ip = %s, mac = %s, port = %d\", log_t::flag_t::INFO, ip.c_str(), mac.c_str(), port);\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvoid active(const uint64_t bid, const server::sample_t::mode_t mode){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s client\", log_t::flag_t::INFO, (mode == server::sample_t::mode_t::CONNECT ? \"Connect\" : \"Disconnect\"));\n\t\t}\n\n\t\tvoid message(const uint64_t bid, const vector \u003cchar\u003e \u0026 buffer, server::sample_t * sample){\n\t\t\t(void) bid;\n\n\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, string(buffer.begin(), buffer.end()).c_str());\n\n\t\t\tsample-\u003esend(bid, buffer.data(), buffer.size());\n\t\t}\n\tpublic:\n\t\tServer(const fmk_t * fmk, const log_t * log) : _fmk(fmk), _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\tdns_t dns(\u0026fmk, \u0026log);\n\n\tserver::core_t core(\u0026dns, \u0026fmk, \u0026log);\n\tserver::sample_t sample(\u0026core, \u0026fmk, \u0026log);\n\n\tServer executor(\u0026fmk, \u0026log);\n\n\tlog.name(\"UDP UnixSocket Server\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tcore.sonet(awh::scheme_t::sonet_t::UDP);\n\tcore.family(awh::scheme_t::family_t::NIX);\n\n\tsample.init(\"anyks\");\n\n\tsample.callback \u003cvoid (const uint64_t, const server::sample_t::mode_t)\u003e (\"active\", std::bind(\u0026Server::active, \u0026executor, _1, _2));\n\tsample.callback \u003cbool (const string \u0026, const string \u0026, const uint32_t)\u003e (\"accept\", std::bind(\u0026Server::accept, \u0026executor, _1, _2, _3));\n\tsample.callback \u003cvoid (const uint64_t, const vector \u003cchar\u003e \u0026)\u003e (\"message\", std::bind(\u0026Server::message, \u0026executor, _1, _2, \u0026sample));\n\n\tsample.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example Cluster\n```c++\n#include \u003ccore/cluster.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nclass Executor {\n\tprivate:\n\t\tlog_t * _log;\n\tpublic:\n\n\t\tvoid events(const cluster_t::family_t worker, const pid_t pid, const cluster_t::event_t event, cluster::core_t * core){\n\t\t\t(void) pid;\n\n\t\t\tif(event == cluster_t::event_t::START){\n\t\t\t\tswitch(static_cast \u003cuint8_t\u003e (worker)){\n\t\t\t\t\tcase static_cast \u003cuint8_t\u003e (cluster_t::family_t::MASTER): {\n\t\t\t\t\t\tconst char * message = \"Hi!\";\n\n\t\t\t\t\t\tcore-\u003ebroadcast(message, strlen(message));\n\t\t\t\t\t} break;\n\t\t\t\t\tcase static_cast \u003cuint8_t\u003e (cluster_t::family_t::CHILDREN): {\n\t\t\t\t\t\tconst char * message = \"Hello\";\n\n\t\t\t\t\t\tcore-\u003esend(message, strlen(message));\n\t\t\t\t\t} break;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvoid message(const cluster_t::family_t worker, const pid_t pid, const char * buffer, const size_t size){\n\t\t\tswitch(static_cast \u003cuint8_t\u003e (worker)){\n\t\t\t\tcase static_cast \u003cuint8_t\u003e (cluster_t::family_t::MASTER):\n\t\t\t\t\tthis-\u003e_log-\u003eprint(\"Message from children [%u]: %s\", log_t::flag_t::INFO, pid, string(buffer, size).c_str());\n\t\t\t\tbreak;\n\t\t\t\tcase static_cast \u003cuint8_t\u003e (cluster_t::family_t::CHILDREN):\n\t\t\t\t\tthis-\u003e_log-\u003eprint(\"Message from master: %s [%u]\", log_t::flag_t::INFO, string(buffer, size).c_str(), ::getpid());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tvoid launched(const awh::core_t::status_t status){\n\t\t\tswitch(static_cast \u003cuint8_t\u003e (status)){\n\t\t\t\tcase static_cast \u003cuint8_t\u003e (awh::core_t::status_t::START):\n\t\t\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, \"Start cluster\");\n\t\t\t\tbreak;\n\t\t\t\tcase static_cast \u003cuint8_t\u003e (awh::core_t::status_t::STOP):\n\t\t\t\t\tthis-\u003e_log-\u003eprint(\"%s\", log_t::flag_t::INFO, \"Stop cluster\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\tpublic:\n\t\tExecutor(log_t * log) : _log(log) {}\n};\n\nint32_t main(int32_t argc, char * argv[]){\n\tfmk_t fmk;\n\tlog_t log(\u0026fmk);\n\n\tExecutor executor(\u0026log);\n\tcluster::core_t core(\u0026fmk, \u0026log);\n\n\tlog.name(\"Cluster\");\n\tlog.format(\"%H:%M:%S %d.%m.%Y\");\n\n\tcore.size();\n\tcore.autoRestart(true);\n\n\tcore.callback \u003cvoid (const awh::core_t::status_t)\u003e (\"status\", std::bind(\u0026Executor::launched, \u0026executor, _1));\n\tcore.callback \u003cvoid (const cluster_t::family_t, const pid_t, const cluster_t::event_t)\u003e (\"events\", std::bind(\u0026Executor::events, \u0026executor, _1, _2, _3, \u0026core));\n\tcore.callback \u003cvoid (const cluster_t::family_t, const pid_t, const char *, const size_t)\u003e (\"message\", std::bind(\u0026Executor::message, \u0026executor, _1, _2, _3, _4));\n\n\tcore.start();\n\n\treturn EXIT_SUCCESS;\n}\n```\n\n### Example IP-address\n```c++\n#include \u003cnet/net.hpp\u003e\n\nusing namespace std;\nusing namespace awh;\n\nint32_t main(int32_t argc, char * argv[]){\n\tnet_t net{};\n\n\tnet = \"[2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d]\";\n\tcout \u003c\u003c \" [2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d] || \" \u003c\u003c net \u003c\u003c \" === \" \u003c\u003c net.get(net_t::format_t::LONG_IPV4) \u003c\u003c \" === \" \u003c\u003c net.get(net_t::format_t::MIDDLE_IPV4) \u003c\u003c \" === \" \u003c\u003c net.get(net_t::format_t::SHORT_IPV4) \u003c\u003c endl;\n\n\tnet = \"2001:0db8:0000:0000:0000:0000:ae21:ad12\";\n\tcout \u003c\u003c \" 2001:0db8:0000:0000:0000:0000:ae21:ad12 || \" \u003c\u003c net \u003c\u003c endl;\n\n\tnet = \"2001:db8::ae21:ad12\";\n\tcout \u003c\u003c \" 2001:db8::ae21:ad12 || \" \u003c\u003c net.get(net_t::format_t::LONG) \u003c\u003c \" and \" \u003c\u003c net.get(net_t::format_t::MIDDLE) \u003c\u003c endl;\n\n\tnet = \"0000:0000:0000:0000:0000:0000:ae21:ad12\";\n\tcout \u003c\u003c \" 0000:0000:0000:0000:0000:0000:ae21:ad12 || \" \u003c\u003c net.get(net_t::format_t::SHORT) \u003c\u003c endl;\n\n\tnet = \"::ae21:ad12\";\n\tcout \u003c\u003c \" ::ae21:ad12 || \" \u003c\u003c net.get(net_t::format_t::MIDDLE) \u003c\u003c endl;\n\n\tnet = \"2001:0db8:11a3:09d7:1f34::\";\n\tcout \u003c\u003c \" 2001:0db8:11a3:09d7:1f34:: || \" \u003c\u003c net.get(net_t::format_t::LONG) \u003c\u003c endl;\n\n\tnet = \"::ffff:192.0.2.1\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" ::ffff:192.0.2.1 || \" \u003c\u003c net \u003c\u003c \" ==== \" \u003c\u003c net.broadcastIPv6ToIPv4() \u003c\u003c endl;\n\n\tnet = \"::1\";\n\tcout \u003c\u003c \" ::1 || \" \u003c\u003c net.get(net_t::format_t::LONG) \u003c\u003c endl;\n\n\tnet = \"[::]\";\n\tcout \u003c\u003c \" [::] || \" \u003c\u003c net.get(net_t::format_t::LONG) \u003c\u003c endl;\n\n\tnet = \"46.39.230.51\";\n\tcout \u003c\u003c \" 46.39.230.51 || \" \u003c\u003c net.get(net_t::format_t::LONG) \u003c\u003c \" ==== \" \u003c\u003c net.broadcastIPv6ToIPv4() \u003c\u003c endl;\n\n\tnet = \"192.16.0.1\";\n\tcout \u003c\u003c \" 192.16.0.1 || \" \u003c\u003c net.get(net_t::format_t::LONG) \u003c\u003c \" === \" \u003c\u003c net.get(net_t::format_t::LONG_IPV6) \u003c\u003c \" === \" \u003c\u003c net.get(net_t::format_t::SHORT_IPV6) \u003c\u003c \" === \" \u003c\u003c net.get(net_t::format_t::MIDDLE_IPV6) \u003c\u003c endl;\n\n\tnet = \"2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d\";\n\tcout \u003c\u003c \" Part of the address: 2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d || \" \u003c\u003c net.v6()[0] \u003c\u003c \" and \" \u003c\u003c net.v6()[1] \u003c\u003c endl;\n\n\tnet = \"46.39.230.51\";\n\tcout \u003c\u003c \" Part of the address: 46.39.230.51 || \" \u003c\u003c net.v4() \u003c\u003c endl;\n\n\tnet = \"2001:1234:abcd:5678:9877:3322:5541:aabb\";\n\tnet.impose(53, net_t::addr_t::NETWORK);\n\tcout \u003c\u003c \" Prefix set: 2001:1234:abcd:5678:9877:3322:5541:aabb/53 || \" \u003c\u003c net \u003c\u003c endl;\n\n\tnet = \"2001:1234:abcd:5678:9877:3322:5541:aabb\";\n\tnet.impose(\"FFFF:FFFF:FFFF:F800::\", net_t::addr_t::NETWORK);\n\tcout \u003c\u003c \" Mask set: 2001:1234:abcd:5678:9877:3322:5541:aabb/FFFF:FFFF:FFFF:F800:: || \" \u003c\u003c net \u003c\u003c endl;\n\n\tnet = \"192.168.3.192\";\n\tnet.impose(9, net_t::addr_t::NETWORK);\n\tcout \u003c\u003c \" Prefix set: 192.168.3.192/9 || \" \u003c\u003c net \u003c\u003c endl;\n\n\tnet = \"192.168.3.192\";\n\tnet.impose(\"255.128.0.0\", net_t::addr_t::NETWORK);\n\tcout \u003c\u003c \" Mask set: 192.168.3.192/255.128.0.0 || \" \u003c\u003c net \u003c\u003c endl;\n\n\tnet = \"192.168.3.192\";\n\tnet.impose(\"255.255.255.0\", net_t::addr_t::NETWORK);\n\tcout \u003c\u003c \" Mask set: 192.168.3.192/255.255.255.0 || \" \u003c\u003c net \u003c\u003c endl;\n\n\tnet = \"2001:1234:abcd:5678:9877:3322:5541:aabb\";\n\tnet.impose(53, net_t::addr_t::HOST);\n\tcout \u003c\u003c \" Get host from IP-address: 53/2001:1234:abcd:5678:9877:3322:5541:aabb || \" \u003c\u003c net \u003c\u003c endl;\n\n\tnet = \"2001:1234:abcd:5678:9877:3322:5541:aabb\";\n\tnet.impose(\"FFFF:FFFF:FFFF:F800::\", net_t::addr_t::HOST);\n\tcout \u003c\u003c \" Get host from IP-address: FFFF:FFFF:FFFF:F800::/2001:1234:abcd:5678:9877:3322:5541:aabb || \" \u003c\u003c net \u003c\u003c endl;\n\n\tnet = \"192.168.3.192\";\n\tnet.impose(9, net_t::addr_t::HOST);\n\tcout \u003c\u003c \" Get host from IP-address: 9/192.168.3.192 || \" \u003c\u003c net \u003c\u003c endl;\n\n\tnet = \"192.168.3.192\";\n\tnet.impose(\"255.128.0.0\", net_t::addr_t::HOST);\n\tcout \u003c\u003c \" Get host from IP-address: 255.128.0.0/192.168.3.192 || \" \u003c\u003c net \u003c\u003c endl;\n\n\tnet = \"192.168.3.192\";\n\tnet.impose(24, net_t::addr_t::HOST);\n\tcout \u003c\u003c \" Get host from IP-address: 24/192.168.3.192 || \" \u003c\u003c net \u003c\u003c endl;\n\n\tnet = \"192.168.3.192\";\n\tnet.impose(\"255.255.255.0\", net_t::addr_t::HOST);\n\tcout \u003c\u003c \" Get host from IP-address: 255.255.255.0/192.168.3.192 || \" \u003c\u003c net \u003c\u003c endl;\n\n\tnet = \"192.168.3.192\";\n\tcout \u003c\u003c \" Get address mask from network prefix = 9 || \" \u003c\u003c net.prefix2Mask(9) \u003c\u003c endl;\n\tcout \u003c\u003c \" Get address prefix from network mask = 255.128.0.0 || \" \u003c\u003c static_cast \u003cuint16_t\u003e (net.mask2Prefix(\"255.128.0.0\")) \u003c\u003c endl;\n\n\tnet = \"2001:1234:abcd:5678:9877:3322:5541:aabb\";\n\tcout \u003c\u003c \" Get address mask from network prefix = 53 || \" \u003c\u003c net.prefix2Mask(53) \u003c\u003c endl;\n\tcout \u003c\u003c \" Get address prefix from network mask = FFFF:FFFF:FFFF:F800:: || \" \u003c\u003c static_cast \u003cuint16_t\u003e (net.mask2Prefix(\"FFFF:FFFF:FFFF:F800::\")) \u003c\u003c endl;\n\n\tnet = \"192.168.3.192\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Check the address compliance 192.168.3.192 by network 192.168.0.0 || \" \u003c\u003c net.mapping(\"192.168.0.0\") \u003c\u003c endl;\n\t\n\tnet = \"2001:1234:abcd:5678:9877:3322:5541:aabb\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Check the address compliance 2001:1234:abcd:5678:9877:3322:5541:aabb by network 2001:1234:abcd:5678:: || \" \u003c\u003c net.mapping(\"2001:1234:abcd:5678::\") \u003c\u003c endl;\n\t\n\tnet = \"192.168.3.192\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Check the address compliance 192.168.3.192 by network 192.128.0.0/9 || \" \u003c\u003c net.mapping(\"192.128.0.0\", 9, net_t::addr_t::NETWORK) \u003c\u003c endl;\n\n\tnet = \"2001:1234:abcd:5678:9877:3322:5541:aabb\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Check the address compliance 2001:1234:abcd:5678:9877:3322:5541:aabb by network 2001:1234:abcd:5000::/53 || \" \u003c\u003c net.mapping(\"2001:1234:abcd:5000::\", 53, net_t::addr_t::NETWORK) \u003c\u003c endl;\n\n\tnet = \"192.168.3.192\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Check the address compliance 192.168.3.192 by network 192.128.0.0/255.128.0.0 || \" \u003c\u003c net.mapping(\"192.128.0.0\", \"255.128.0.0\", net_t::addr_t::NETWORK) \u003c\u003c endl;\n\n\tnet = \"2001:1234:abcd:5678:9877:3322:5541:aabb\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Check the address compliance 2001:1234:abcd:5678:9877:3322:5541:aabb by network 2001:1234:abcd:5000::/FFFF:FFFF:FFFF:F800:: || \" \u003c\u003c net.mapping(\"2001:1234:abcd:5000::\", \"FFFF:FFFF:FFFF:F800::\", net_t::addr_t::NETWORK) \u003c\u003c endl;\n\n\tnet = \"192.168.3.192\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Check the address compliance 192.168.3.192 by host 9/0.40.3.192 || \" \u003c\u003c net.mapping(\"0.40.3.192\", 9, net_t::addr_t::HOST) \u003c\u003c endl;\n\n\tnet = \"2001:1234:abcd:5678:9877:3322:5541:aabb\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Check the address compliance 2001:1234:abcd:5678:9877:3322:5541:aabb by host 53/::678:9877:3322:5541:AABB || \" \u003c\u003c net.mapping(\"::678:9877:3322:5541:AABB\", 53, net_t::addr_t::HOST) \u003c\u003c endl;\n\n\tnet = \"192.168.3.192\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Check the address compliance 192.168.3.192 by host 255.128.0.0/0.40.3.192 || \" \u003c\u003c net.mapping(\"0.40.3.192\", \"255.128.0.0\", net_t::addr_t::HOST) \u003c\u003c endl;\n\n\tnet = \"2001:1234:abcd:5678:9877:3322:5541:aabb\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Check the address compliance 2001:1234:abcd:5678:9877:3322:5541:aabb by host FFFF:FFFF:FFFF:F800::/::678:9877:3322:5541:AABB || \" \u003c\u003c net.mapping(\"::678:9877:3322:5541:AABB\", \"FFFF:FFFF:FFFF:F800::\", net_t::addr_t::HOST) \u003c\u003c endl;\n\n\tnet = \"192.168.3.192\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Check whether the address 192.168.3.192 is in range [192.168.3.100 - 192.168.3.200] || \" \u003c\u003c net.range(\"192.168.3.100\", \"192.168.3.200\", 24) \u003c\u003c endl;\n\n\tnet = \"2001:1234:abcd:5678:9877:3322:5541:aabb\";\n\tconst auto \u0026 dump = net.data \u003cvector \u003cuint16_t\u003e\u003e ();\n\tfor(auto \u0026 item : dump)\n\t\tcout \u003c\u003c \" IPv6 address chunk data || \" \u003c\u003c item \u003c\u003c endl;\n\n\tnet = \"46.39.230.51\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Checking whether IP-address is global 46.39.230.51 || \" \u003c\u003c (net.mode() == net_t::mode_t::WAN) \u003c\u003c endl;\n\n\tnet = \"192.168.31.12\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Checking whether IP-address is local 192.168.31.12 || \" \u003c\u003c (net.mode() == net_t::mode_t::LAN) \u003c\u003c endl;\n\n\tnet = \"0.0.0.0\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Checking whether IP-address is system 0.0.0.0 || \" \u003c\u003c (net.mode() == net_t::mode_t::SYS) \u003c\u003c endl;\n\n\tnet = \"[2a00:1450:4010:c0a::8b]\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Checking whether IP-address is global [2a00:1450:4010:c0a::8b] || \" \u003c\u003c (net.mode() == net_t::mode_t::WAN) \u003c\u003c endl;\n\n\tnet = \"::1\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Checking whether IP-address is local [::1] || \" \u003c\u003c (net.mode() == net_t::mode_t::LAN) \u003c\u003c endl;\n\n\tnet = \"::\";\n\tcout \u003c\u003c boolalpha;\n\tcout \u003c\u003c \" Checking whether IP-address is system [::] || \" \u003c\u003c (net.mode() == net_t::mode_t::SYS) \u003c\u003c endl;\n\n\tstring ip = \"2001:0db8:0000:0000:0000:0000:ae21:ad12\";\n\tcout \u003c\u003c \" Long record address || \" \u003c\u003c ip \u003c\u003c endl;\n\tip = net = ip;\n\tcout \u003c\u003c \" Short record address || \" \u003c\u003c ip \u003c\u003c endl;\n\n\tnet = \"73:0b:04:0d:db:79\";\n\tcout \u003c\u003c \" MAC: 73:0b:04:0d:db:79 || \" \u003c\u003c net \u003c\u003c endl;\n\n\tnet.arpa(\"70.255.255.5.in-addr.arpa\");\n\tcout \u003c\u003c \" ARPA: 70.255.255.5.in-addr.arpa || \" \u003c\u003c net \u003c\u003c endl;\n\tcout \u003c\u003c \" ARPA IPv4: \" \u003c\u003c net.arpa() \u003c\u003c endl;\n\n\tnet.arpa(\"b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa\");\n\tcout \u003c\u003c \" ARPA: b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa || \" \u003c\u003c net \u003c\u003c endl;\n\tcout \u003c\u003c \" ARPA IPv6: \" \u003c\u003c net.arpa() \u003c\u003c endl;\n\n\treturn EXIT_SUCCESS;\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanyks%2Fawh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanyks%2Fawh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanyks%2Fawh/lists"}