// connection.h - Минималистичный API для защищенных UDP подключений #ifndef CONNECTION_H #define CONNECTION_H #include #include #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 */