// Платформенный слой: сокеты, таймеры, CSPRNG, потоки. // Одна реализация на платформу: platform/posix (Linux) и platform/esp-idf. // Все функции — блокирующие; коды ошибок через возвращаемое значение (-1), // без исключений. IP-адреса — uint32_t в host byte order. #pragma once #include #include namespace fgl::plat { // ---- время ---- // Монотонные миллисекунды с неопределённой точки отсчёта. uint64_t now_ms(); // ---- CSPRNG ---- // Заполняет buf cryptographically-secure случайными байтами. bool random(uint8_t* buf, size_t len); // ---- потоки ---- // Идентификатор потока (непрозрачный). Валиден между thread_create и // завершением thread_join. using ThreadId = void*; // Создаёт поток с именем name (для отладки) и стеком stack_bytes (0 — по // умолчанию платформы; для ESP-IDF задавать явно, >= 4096). // out_id может быть nullptr (тогда присоединиться нельзя). bool thread_create(void (*fn)(void*), void* ctx, const char* name, uint32_t stack_bytes, ThreadId* out_id); // Блокирующе ждёт завершения потока. Гарантирует, что код потока больше не // исполняется (объекты потока можно освобождать после возврата). void thread_join(ThreadId id); // Мягкая блокирующая задержка текущего потока. void sleep_ms(uint32_t ms); // ---- TCP (клиент и сервер) ---- // Создаёт слушающий сокет; возвращает fd или -1. port==0 — любой свободный // (узнать выбранный: tcp_local_port). int tcp_listen(uint16_t port); // Локальный порт сокета (для ephemeral-слушателем). uint16_t tcp_local_port(int fd); // Принимает соединение (блокирующе); возвращает fd клиента или -1. // peer_ip (host byte order) / peer_port могут быть nullptr. int tcp_accept(int listen_fd, uint32_t* peer_ip, uint16_t* peer_port); // Подключается к host:port (host — DNS-имя или dotted-quad) с таймаутом. int tcp_connect(const char* host, uint16_t port, uint32_t timeout_ms); long tcp_send(int fd, const void* buf, size_t len); // >0 / -1 // Блокирующее чтение; 0 — EOF, -1 — ошибка/таймаут. long tcp_recv(int fd, void* buf, size_t len); // Таймауты на последующие recv/send (0 — без таймаута). bool tcp_set_timeout(int fd, uint32_t rx_ms, uint32_t tx_ms); // Ожидание читаемости fd (для выходa из блокирующего accept). Таймаут в мс. bool tcp_poll_readable(int fd, uint32_t timeout_ms); // Прерывает блокированные recv/send на сокете (для остановки сервера). bool tcp_shutdown(int fd); void tcp_close(int fd); } // namespace fgl::plat