# Устройство etcpmon Действующие контракты и использование описаны в [etcpmon_doc.md](etcpmon_doc.md), API — в `etcpmon_client.h`, `etcpmon_gui.h`, `etcpmon_graph.h` и `etcpmon_protocol.h`. Серверная реализация: `src/control_server.c/h` и [control_server_doc.md](../../src/control_server_doc.md). `WinMain` создаёт `etcpmon_app`, инициализирует Winsock/классы окон, создаёт окно и запускает message loop. Таймер GUI вызывает неблокирующий `etcpmon_client_process()`; фонового сетевого потока нет. Client завершает connect, разбирает TCP-кадры, обновляет кеши и вызывает GUI callbacks. Сэмпл истории добавляет только парсер ответа метрик; GUI отображает уже сохранённую историю. Все команды клиента проходят через один TX FIFO с лимитом 64 КиБ/256 кадров и смещением досылки. Pending с ненулевым seq регистрируется вместе с кадром, но срок ответа начинается после полной отправки. Тип и payload ответа проверяются до снятия pending и вызова callback. Сервер использует `ll_queue` с одним кадром до 32 КиБ и отдельным смещением частичной отправки. Чтение/разбор команд ждут пустой очереди через отменяемый deferred waiter. Начальная подписка хранит ID узлов и сериализует актуальную запись при освобождении TX; live-изменения объединяются в ограниченном наборе из 256 ID. Переполнение отключает подписчика с диагностикой. Перед освобождением клиента отменяются таймер и waiter, затем освобождаются снимок и очередь. Метрики выдаются по запросу, а сообщения об узлах UTUN — только после явной подписки другого клиента; сам GUI etcpmon подписку не использует. Проверки клиента: `make -C tools/etcpmon CC=x86_64-w64-mingw32-gcc TEST_RUNNER=wine check`. Проверки серверных очередей/cleanup/метрик: цель `test_control_server` из `tests/Makefile.am`. Они проверяют разные стороны протокола и не заменяют интеграционный запуск клиента с сервером.