Этот модуль в основном поддерживает:
- мониторинг сетевого сервера (поддерживает TCP/UDP/UNIX domain socket);
- подключение сетевого клиента (поддерживает TCP/UNIX domain socket);
- кэширование результатов запроса DNS-домена (поддерживает вызов системной функции gethostbyname/getaddrinfo и прямой двухсторонний протокол Send DNS);
- операции с сокетами (socket) и использование локальной сетевой карты, а также другие функции.
Неблокирующий сетевой поток:
- поддержка режима соединения в неблокирующем режиме;
- чтение (построчное чтение, чтение указанной длины), запись (запись строки, запись указанной длины, запись набора данных) и другие операции.
Библиотека протоколов общего сетевого приложения:
- в основном поддерживает распространённые протоколы сетевых приложений, такие как HTTP, SMTP, ICMP. В модулях HTTP и ICMP реализованы методы блокирующей и неблокирующей связи. Кроме того, протокол HTTP поддерживает сервер и клиент в версии C++ lib_acl_cpp. При использовании в качестве сервера он поддерживает интерфейс, аналогичный JAVA HttpServlet. В клиентском режиме он поддерживает управление пулом соединений и кластером. Модуль поддерживает файлы cookie, сеансы и загрузку файлов MIME HTTP. Богатые функции, такие как блочная передача, автоматическое преобразование кодировки, автоматическая распаковка и возобновление с точки останова.
Общая библиотека сетевой коммуникации:
- поддерживает memcached, beanstalk, клиентскую библиотеку обработки сокетов, библиотека поддерживает режим пула соединений.
1.2. Coroutine
Модуль сопрограммы в Acl можно использовать на нескольких платформах, и существует множество инженерных практик в некоторых важных проектах.
- Работает на Linux, MacOS, Windows, iOS и Android.
- Поддерживает архитектуры x86 и Arm.
- Поддержка select/poll/epoll/kqueue/iocp/win32 GUI message.
- DNS-протокол был реализован в сопрограмме acl, поэтому API DNS также можно использовать в модели сопрограмм.
- Перехват системного IO API в Unix и Windows:
-
API чтения: read/readv/recv/recvfrom/recvmsg.
-
API записи: write/writev/send/sendto/sendmsg/sendfile64.
-
Socket API: socket/listen/accept/connect/setsockopt.
-
Event API: select/poll/epoll_create/epoll_ctl/epoll_wait.
-
DNS API: gethostbyname/gethostbyname_r/getaddrinfo/freeaddrinfo.
- Поддержка режима общего стека для минимизации использования памяти.
- Синхронизация примитивов:
- мьютекс, семафор сопрограммы можно использовать между сопрограммами;
- событие сопрограммы можно использовать между сопрограммами и потоками.
Для получения дополнительной информации см. Использование волокна Acl.
1.3. HTTP-модуль
Поддерживает HTTP/1.1, может использоваться на стороне клиента и сервера.
- Интерфейс HttpServlet, подобный Java (на стороне сервера).
- Режим пула соединений (на стороне клиента).
- Блочное разбиение по частям.
- Сжатие/распаковка Gzip.
- Шифрование SSL.
- Передача точек останова.
- Установка/получение файлов cookie.
- Управление сеансами (на стороне сервера).
- Передача Websocket.
- Формат HTTP MIME.
- Синхронный/асинхронный режим.
- ...
1.4. Redis-клиент
Redis-клиент в Acl мощный, высокопроизводительный и простой в использовании.
- Поддержка Bitmap/String/Hash/List/Set/Sorted Set/PubSub/HyperLogLog/Geo/Script/Stream/Server/Cluster и т. д.
- Предоставляет интерфейс C++, подобный STL, для каждой команды redis.
- Автоматически кэширует и адаптируется к изменениям хэш-слотов кластера redis на клиенте.
- Связь в одиночном, кластерном или конвейерном режиме.
- В одиночном или кластерном режиме можно использовать пул соединений.
- Высокая производительность в кластерном или конвейерном режимах.
- Одинаковый интерфейс для одиночного, кластерного и конвейерного режимов.
- Автоматическая повторная попытка из-за ошибки сети.
- Можно использовать в режиме сопрограммы с общим стеком.
- Для получения дополнительной информации см. Использование клиента Acl redis.
1.5. MQTT-модуль
В Acl реализована версия MQTT 3.1.1 с анализатором потоков, поэтому её можно использовать независимо от любого режима ввода-вывода.
- Поддержка протокола MQTT 3.1.1: CONNECT/CONNACK/PUBLISH/PUBACK/PUBREC/PUBREL/PUBCOMP/SUBSCRIBE/SUBACK/UNSUBSCRIBE/UNSUBACK/PINGREQ/PINGRESP/DISCONNECT.
- Один класс на команду.
- Анализатор потоков можно использовать для любого режима ввода-вывода.
- Анализ данных отделяется от сетевой связи.
- Может использоваться на клиенте и сервере. Но также реализует протокол DNS, указанный в RFC1035. Пользователи могут использовать модуль DNS в Acl для реализации собственного DNS-клиента или сервера.
3. Поддержка платформ и компиляция
3.1. Компиляция Acl на разных платформах
Проект Acl в настоящее время поддерживает Linux, Windows, MacOS, FreeBSD, Solaris, Android и iOS.
-
Linux/UNIX: компилятор — gcc/clang, перейдите в каталог
acl/
и запустите make
, тогда в каталоге acl/
будут сгенерированы файлы libacl_all.a и libacl_all.so, libacl_all.a состоит из трёх библиотек, включая lib_acl.a, lib_protocol.a и libacl_cpp.a;
Вы также можете использовать cmake для сборки и установки библиотек Acl, запустив скрипт cmake-build.sh
в каталоге Acl;
И xmake
также может компилировать Acl при запуске xmake
в каталоге Acl.
-
Windows: можно скомпилировать с помощью VS2003/VS2008/VS2010/VS2012/VS2013/VS2015/VS2019. (Если вам нужно скомпилировать с VS6/VS2005, вы можете обратиться к условиям компиляции VS2003);
-
MacOS/iOS: скомпилирован с xcode;
-
Android: откройте проект Adnroid в
acl/android/acl_c++_shared/
с помощью Android Studio
;
- Поддержка кроссплатформенной компиляции с cmake.
3.2. Меры предосторожности при компиляции в Windows
При использовании динамических библиотек в среде WIN32 необходимо учитывать несколько моментов:
- При использовании динамической библиотеки lib_acl её необходимо предварительно определить в проекте пользователя: ACL_DLL;
- При использовании HTTP-библиотеки или ICMP-библиотеки в динамической библиотеке lib_protocol необходимо предварительно определить HTTP_DLL или ICMP_DLL в проекте;
- При использовании динамической библиотеки lib_acl_cpp необходимо предварительно определить ACL_CPP_DLL в проекте. Если вы используете среду компилятора VC2003, вам необходимо предварительно определить VC2003;
- При использовании динамической библиотеки lib_dict необходимо предварительно определить DICT_DLL в проекте;
- При использовании динамической библиотеки lib_tls необходимо предварительно определить TLS_DLL в вашем проекте.
- Подробный процесс компиляции см.: Компиляция и использование библиотеки acl
4. Быстрый старт
4.1. Первая демонстрация с Acl
#include <iostream>
#include "acl_cpp/lib_acl.hpp"
int main(void) {
acl::string buf = "hello world!\r\n";
std::cout << buf.c_str() << std::endl;
return 0;
}
4.2. Простой TCP-сервер
#include <thread>
#include "acl_cpp/lib_acl.hpp"
void run(void) {
const char* addr = "127.0.0.1:8088";
acl::server_socket server;
if (!server.open(addr)) { // Bind and listen the local address.
return;
}
while (true) {
acl::socket_stream* conn = server.accept(); // Wait for connection.
if (conn == NULL) {
break;
}
std::thread thread([=] { // Start one thread to handle the connection.
char buf[256];
int ret = conn->read(buf, sizeof(buf), false); // Read data.
if (ret > 0) {
conn->write(buf, ret); // Write the received data.
}
delete conn;
});
thread.detach();
}
}
4.3. Простой TCP-клиент
#include "acl_cpp/lib_acl.hpp"
void run(void) {
const char* addr = "127.0.0.1:8088";
int conn_timeout = 5, rw_timeout = 10;
acl::socket_stream conn;
if (!conn.open(addr, conn_timeout, rw_timeout)) { // Connecting the server.
return;
}
const char data[] = "Hello world!\r\n";
if (conn.write(data, sizeof(data) - 1) == -1) { // Send data to server.
return;
}
char buf[256];
int ret = conn.read(buf, sizeof(buf) - 1, false);
if (ret > 0) { // Read from server.
buf[ret] = 0;
std::cout << buf << std::endl;
}
}
4.4. Корутинный TCP-сервер
#include "acl_cpp/lib_acl.hpp"
#include "fiber/go_fiber.hpp"
void run(void) {
const char* addr = "127.0.0.1:8088";
acl::server_socket server;
if (!server.open(addr)) {
return;
}
go[&] { // Create one server coroutine to wait for connection.
while (true) {
acl::shared_stream conn = server.shared_accept();
if (conn == nullptr) {
break;
}
go[conn] { // Create one client coroutine to handle the connection.
while (true) {
char buf[256];
int ret = conn->read(buf, sizeof(buf), false);
if (ret <= 0
Комментарии ( 0 )