#linux #api #gnu #router #openwrt
#linux #API #гну #маршрутизатор #openwrt
Вопрос:
У меня есть простое приложение на маршрутизаторе в стиле OpenWRT. В настоящее время он написан на C . Маршрутизатор (встроенный Linux) имеет очень ограниченное дисковое пространство и оперативную память. Например, недостаточно места для установки Python.
Итак, я хочу управлять этим демоническим приложением через сеть. Я прочитал несколько руководств по созданию сокетов и прослушиванию порта на предмет активности. Но я не смог интегрировать поток в класс C . И я не смог понять, как расшифровать полученную информацию или как отправить ответ.
Все учебные пособия, которые я прочитал, являются тупиковыми, они показывают вам, как создать сервер, который в основном просто блокируется, пока не получит что-то, а затем возвращает сообщение, когда оно что-то получило.
Есть ли что-то более высокого уровня, что можно использовать для подобных вещей?
Ответ №1:
Похоже, вы спрашиваете: «Как мне создать простую сетевую службу, которая будет принимать запросы от клиентов и что-то делать в ответ?» В этом есть множество частей — как вы создаете структуру сервиса, как вы кодируете и декодируете запросы, как вы обрабатываете запросы и как вы связываете все это вместе?
Похоже, у вас возникли проблемы с первой и последней частями. Существует два основных способа организации такого простого сервиса — потоковый подход и событийный подход.
В потоковом подходе вы создаете поток для каждого входящего соединения. Этот поток считывает сообщения (запросы) из этого соединения (дескриптора файла), обрабатывает их и записывает ответы. Когда соединение прерывается, поток завершается. У вас есть основной «прослушивающий» поток, который принимает входящие соединения и создает новые потоки для обработки каждого из них.
При событийном подходе каждый входящий запрос становится событием. Затем у вас есть обработчики событий, которые обрабатывают эти события, отправляя ответы. Важно, чтобы обработчики событий НЕ блокировались и не завершались быстро, иначе может показаться, что служба заблокирована. В вашей программе есть основной цикл событий, который ожидает входящих событий (обычно блокируется при одиночном poll
select
вызове or) и считывает и отправляет каждое событие соответствующим образом.
Комментарии:
1. Вы даете хороший ответ, хотя я надеялся, что будет что-то доступное, что сэкономит мне немного работы по созданию этого. Хотелось бы, чтобы это было похоже на iOS, где запросы URL абстрагируются и более или менее обрабатываются. Я чувствую, что буду 1000-м человеком, который реализует такую вещь.
Ответ №2:
Я установил пакет python-mini с opkg, который имеет поддержку сокетов и потоков. Работает как шарм на WRT160NL с backfire / 10.03.1.