C или C++ демон HTTP в потоке?

Я запускаю новое использование дизайна встроенной системы FreeRTOS. Мой последний использовал eCos, который имеет встроенный сервер HTTP, это действительно легко, тем более, что у меня не было файловой системы. Путем это работало, короче говоря, был то, что каждая страница была подобной CGI функцией C, которая была вызвана при необходимости демону HTTP. А именно, Вы записали бы функцию формы:

int MyWebPage(FILE* resp, const char* page, const char* params, void* uData);

где page была часть страницы URL, params были какие-либо параметры формы (только ДОБИРАЮТСЯ, поддерживался, не POST, который предотвратил загрузки файла и таким образом сделал запись флэш-памяти болью), uData маркер, переданный в этом, был установлен, когда Вы зарегистрировали функцию, таким образом, у Вас могла быть та же функциональная подача несколько URL или диапазонов с различными данными, и resp дескриптор файла, к которому Вы пишете ответ HTTP (заголовки и все).

Затем Вы зарегистрировали функцию с:

CYG_HTTPD_TABLE_ENTRY(www_myPage, "/", MyWebPage, 0);

где CYG_HTTPD_TABLE_ENTRY макрос, где первый параметр был именем переменной, второй была страница URL ( * подстановочный знак позволяется; следовательно page быть переданным MyWebPage()), треть является указателем функции и в последний раз uData значение.

Так простой пример:

int HelloWorldPage(FILE* resp, const char*, const char* params, void*)
{
    fprintf("Content-Type: text/html;\n\n");
    fprintf("<html><head><title>Hello World!</title></head>\n");
    fprintf("<body>\n");
    fprintf("<h1>Hello, World!</h1>\n");
    fprintf("<p>You passed in: %s</p>\n", params);
    fprintf("</body></html>\n");
}
CYG_HTTPD_TABLE_ENTRY(www_hello, "/", HelloWorldPage, 0);

(На самом деле, params был бы передан через функцию для выхода из символов волшебства HTML, и я буду использовать другую пару функции, чтобы разделить параметрические усилители и сделать a <ul> из него, но я пропустил это для ясности.)

Сам сервер просто работал как задача (т.е. поток) и не помешал, пока это имело более низкий приоритет, чем критические задачи.

Само собой разумеется, доказывая это неоценимое для тестирования и отладки. (Одна проблема со встроенной работой состоит в том, что Вы обычно не можете бросать XTerm для использования в качестве журнала.) Поэтому, когда Высший Программист рефлексивно обвинил меня в чем-то не работающем (путь наименьшего сопротивления, я предполагаю), я мог потянуть веб-страницу и показать, что он отправил мне плохо параметры. Сохраненный много времени отладки в интеграции.

Так так или иначе... Я задаюсь вопросом, действительно ли там что-то вроде этого доступно как независимая библиотека? Что-то, в чем я могу связаться, регистрирует мои обратные вызовы, порождает поток и позволяет ему сделать волшебство? Или я должен провернуть свое собственное? Я предпочел бы C++, но могу, вероятно, пользоваться библиотекой C также.

Править: Так как я помещаю щедрость на него, я должен разъяснить, что библиотека должна была бы находиться под лицензией с открытым исходным кодом.

7
задан Mike DeSimone 1 March 2010 в 20:29
поделиться

4 ответа

Я предлагаю вам взглянуть на libmicrohttpd, встроенный веб-сервер:

Он маленький и быстрый, имеет простой C API, поддерживает многопоточность, подходит для встроенных систем, поддерживает POST, опционально поддерживает SSL/TLS, и доступен под лицензией LGPL или eCos (в зависимости от ситуации). Я считаю, что это удовлетворяет всем вашим требованиям. Если вы предпочитаете, его можно тривиально обернуть в C++.

4
ответ дан 7 December 2019 в 10:00
поделиться

Я не знаком с FreeRTOS и тем, как она поддерживает TCP/IP и сокеты, поэтому не могу сказать наверняка, но вы можете взглянуть на веб-сервер GoAhead. http://embedthis.com/goahead/

0
ответ дан 7 December 2019 в 10:00
поделиться

http://www.ibm.com/developerworks/systems/library/es-nweb/index.html

Кажется, именно то, что вам нужно . Мне нужно немного переписать, чтобы заставить его работать под FreeRTOS, но это очень маленький и очень легкий веб-сервер.

0
ответ дан 7 December 2019 в 10:00
поделиться

Mongoose находится под лицензией GPLv2 и имеет небольшой вес (всего один файл C так легко включить в новый проект). Он будет работать в отдельном потоке и поддерживать обратные вызовы.

2
ответ дан 7 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: