You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
5.3 KiB
129 lines
5.3 KiB
// connection.h - Минималистичный API для защищенных UDP подключений |
|
#ifndef CONNECTION_H |
|
#define CONNECTION_H |
|
|
|
#include <stdint.h> |
|
#include <stddef.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
/* Непрозрачный дескриптор подключения */ |
|
typedef struct conn_handle conn_handle_t; |
|
|
|
/* Forward declaration для uasync */ |
|
typedef struct uasync_s uasync_t; |
|
|
|
/* Режим подключения */ |
|
typedef enum { |
|
CONN_MODE_CLIENT, /* Инициируем подключение к указанному удаленному адресу */ |
|
CONN_MODE_SERVER /* Ожидаем входящие подключения */ |
|
} conn_mode_t; |
|
|
|
/* Callback для входящих данных */ |
|
typedef void (*conn_recv_callback_t)(conn_handle_t* conn, |
|
const uint8_t* data, |
|
size_t len, |
|
void* user_data); |
|
|
|
/* |
|
* Создание дескриптора подключения (только выделение памяти). |
|
* ua - экземпляр uasync для таймеров (обязательный параметр) |
|
* Возвращает NULL при ошибке. |
|
*/ |
|
conn_handle_t* conn_create(uasync_t* ua); |
|
|
|
/* |
|
* Установка криптографических ключей. |
|
* Должна быть вызвана до conn_connect(). |
|
* |
|
* @param conn Дескриптор подключения |
|
* @param my_pub_key Публичный ключ (64 байта для secp256r1), NULL для авто-генерации |
|
* @param my_priv_key Приватный ключ (32 байта), NULL для авто-генерации |
|
* @param peer_pub_key Публичный ключ пира (64 байта), NULL для сервера (получит из первого пакета) |
|
* |
|
* @return 0 при успехе, -1 при ошибке |
|
*/ |
|
int conn_set_keys(conn_handle_t* conn, |
|
const uint8_t* my_pub_key, |
|
const uint8_t* my_priv_key, |
|
const uint8_t* peer_pub_key); |
|
|
|
/* |
|
* Подключение к удаленному узлу или начало ожидания входящих подключений. |
|
* |
|
* @param conn Дескриптор подключения |
|
* @param local_ip Локальный IP для bind (NULL для "0.0.0.0") |
|
* @param local_port Локальный порт (0 для авто-выбора) |
|
* @param remote_ip Удаленный IP (NULL для серверного режима) |
|
* @param remote_port Удаленный порт (игнорируется если remote_ip NULL) |
|
* @param mode Режим подключения (CONN_MODE_CLIENT/SERVER) |
|
* |
|
* @return 0 при успехе, -1 при ошибке |
|
*/ |
|
int conn_connect(conn_handle_t* conn, |
|
const char* local_ip, |
|
uint16_t local_port, |
|
const char* remote_ip, |
|
uint16_t remote_port, |
|
conn_mode_t mode); |
|
|
|
/* |
|
* Установка callback'а для входящих данных. |
|
* Callback будет вызываться при получении полных собранных пакетов. |
|
*/ |
|
void conn_set_recv_callback(conn_handle_t* conn, |
|
conn_recv_callback_t callback, |
|
void* user_data); |
|
|
|
/* |
|
* Отправка данных. |
|
* Данные будут автоматически фрагментированы, зашифрованы и отправлены. |
|
* |
|
* @return 0 при успехе, -1 при ошибке |
|
*/ |
|
int conn_send(conn_handle_t* conn, const uint8_t* data, size_t len); |
|
|
|
/* |
|
* Закрытие подключения (немедленное, без протокола завершения). |
|
* После вызова дескриптор можно уничтожить через conn_destroy(). |
|
*/ |
|
void conn_close(conn_handle_t* conn); |
|
|
|
/* |
|
* Сброс соединения с использованием служебных пакетов. |
|
* Отправляет пакет сброса через ETCP и сбрасывает состояние всех компонентов. |
|
* Предназначено для тестирования и восстановления после сбоев. |
|
*/ |
|
void conn_reset(conn_handle_t* conn); |
|
|
|
/* |
|
* Полное уничтожение дескриптора подключения и освобождение всех ресурсов. |
|
* Автоматически вызывает conn_close() если подключение активно. |
|
*/ |
|
void conn_destroy(conn_handle_t* conn); |
|
|
|
/* |
|
* Получение статистики подключения (опционально). |
|
* |
|
* @return 0 при успехе, -1 при ошибке |
|
*/ |
|
typedef struct { |
|
uint64_t bytes_sent; |
|
uint64_t bytes_received; |
|
uint32_t packets_sent; |
|
uint32_t packets_received; |
|
uint32_t retransmissions; |
|
uint32_t fragments_assembled; |
|
uint16_t current_rtt_ms; /* Текущее RTT в миллисекундах */ |
|
uint16_t jitter_ms; /* Джиттер в миллисекундах */ |
|
} conn_stats_t; |
|
|
|
int conn_get_stats(conn_handle_t* conn, conn_stats_t* stats); |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif /* CONNECTION_H */ |