Веб-разработка на C

#c #web-development-server

#c #веб-разработка-сервер

Вопрос:

Я понимаю, что, поскольку C не является динамичным, он не рассматривается как особенно хорошая база для создания веб-сайта, но я считаю, что частично это зависит от поддержки. Существуют ли какие-либо серверы, которые запускают программы на C , например, как root node.js создает сервер, а затем обрабатывает все запросы, которые отправляются в корень, но CGI (который я не хочу использовать) похож на веб-страницу Php, ограниченную медленным Apache с раздражающими перезаписями. Существуют ли какие-либо библиотеки C , которые позволяют легко встраивать сервер.

Комментарии:

1. Этот вопрос встречается повсеместно; не могли бы вы, возможно, сосредоточиться на одном или двух небольших аспектах этого и попытаться быть более конкретным? (Даже более конкретные вопросы могут быть закрыты как «слишком субъективные», но что-то вроде «У меня возникли проблемы с получением веб-сервера libev для работы с моим проектом на C , <подробности здесь>, есть ли лучший выбор?» вероятно, вы получили бы реальные ответы.)

2. Не уверен, что Wt полностью удовлетворит вашим требованиям. Если вы не знали об этом, обязательно ознакомьтесь: webtoolkit.eu/wt

3. @Wt для абстрагирования, и я бы предпочел использовать что-то вроде haml для оформления своих страниц, что на самом деле доступно, google hardcore-haml

Ответ №1:

Недавно мне (как и два дня назад) пришлось переписать сервлет Java Jetty на C (из-за некоторых проблем JNI с OpenCV, который я также использовал). У меня был точно такой же вопрос, как и у вас, и на него нет простого ответа (я также не хотел использовать CGI). Я предлагаю пару вещей:

Используйте boost, используйте boost, используйте boost.
Boost делает кроссплатформенное развертывание абсолютно тривиальным и (осмелюсь это сказать) увлекательным! Моя машина для разработки работает под управлением Windows 7, но мне пришлось развернуть сервер на сервере Linux, и boost сделал это невероятно простым.

Используйте библиотеку HTTP
Для своего проекта я нашел cpp-netlib, который делает написание сервлетов (если их вообще можно так назвать) очень-очень простым. Он предлагает доступ к request и response объектам и даже поддерживает многопоточность. Вот пример сервера с их веб-сайта:

 #include <boost/network/protocol/http/server.hpp>
#include <string>
#include <iostream>

namespace http = boost::network::http;

struct hello_world;
typedef http::server<hello_world> server;

struct hello_world {
    void operator() (server::request const amp;request,
                     server::response amp;response) {
        std::string ip = source(request);
        response = server::response::stock_reply(
            server::response::ok, std::string("Hello, ")   ip   "!");
    }
};

int
main(int argc, char * argv[]) {

    if (argc != 3) {
        std::cerr << "Usage: " << argv[0] << " address port" << std::endl;
        return 1;
    }

    try {
        hello_world handler;
        server server_(argv[1], argv[2], handler);
        server_.run();
    }
    catch (std::exception amp;e) {
        std::cerr << e.what() << std::endl;
        return 1;
    }

    return 0;
}
  

Очень аккуратно выглядит и (из того, что я видел) также очень надежен. Не (do NOT) пишите свою собственную реализацию HTTP 1.x. Я настоятельно не советую этого делать, потому что это огромные затраты времени и нет причин изобретать велосипед.

Делайте то, что работает для вас
Если вам нужно, чтобы на вашем сервере были некоторые части с возможностью горячей замены, не стесняйтесь использовать простой язык сценариев, такой как LUA, в противном случае просто будьте готовы к компиляции на каждой итерации.

Ответ №2:

Я понимаю это, поскольку C не является динамическим

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

Вы можете писать CGI-скрипты на C или C , когда вам нужна производительность от этого бита. Есть несколько библиотек, которые могут упростить это, и вы должны быть в состоянии найти учебные пособия (быстрый поиск в Google выявил это).

В некоторых случаях вы также можете писать модули для расширения вашего языка сценариев. Я знаю, что PHP в основном реализован на C снизу, и я полагаю, что большинство других скриптовых языков допускают добавление модулей C (C может быть несколько сложнее, но должно быть выполнимо с осторожностью или оболочкой). Вы можете изучить это.

Я бы не рекомендовал использовать Qt для сайта, похоже, он на самом деле не предназначен для этого и потенциально содержит много ненужных вам вещей. Если бы вы шли этим путем, более простой C / C был бы лучше (и быстрее).

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

Комментарии:

1. 1, но с комментарием: я бы предпочел FastCGI, а не CGI. Снижение производительности от создания отдельного дочернего процесса в CGI огромно.

2. Снижение производительности при использовании CGI огромно благодаря языкам и операционным системам, которые делают его огромным. Java для программ на CGI — плохая вещь. Windows и Solaris медленно запускают процесс, Linux и BSD — нет. Если вы используете C , я ожидаю, что накладные расходы на CGI будут незначительными, если только ваш код не выполняет слишком много, до такой степени, что накладные расходы на отказ от использования CGI могут не стоить того, пока вы не будете выполнять миллионы просмотров в день. Статическое связывание тоже помогает. Как всегда, profile, не стройте предположений. Кроме того, смотрите cr.yp.to/publicfile/performance.html