Создание простого Linux API

#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.