Как я пишу веб-сервер в C/C++ на [закрытом] Linux

Я изучаю разработку маленького (read:rudimentary) веб-сервера на платформе Linux, и я понятия не имею, где запустить.

То, что я хочу, чтобы это смогло сделать:

  • Послушайте на определенном порте
  • Займите пост HTTP и получите запросы
  • Ответьте соответственно
  • Никакое управление сеансами не требуется
  • Должен быть в C или C++
  • Должен работать как услуга на начальной загрузке

Я знаком с HTTP-заголовками и являюсь опытным PHP и веб-разработчиком .NET, но я не уверен, где запустить с этой задачи.

Можно ли советовать мне с некоторыми ресурсами соединять кривую обучения мостом?

34
задан Yu Hao 24 June 2014 в 00:44
поделиться

6 ответов

Сверху вниз вам нужно знать о:

  • Протокол HTTP
  • Сервер TCP - программирование сокетов BSD
  • запись базового демона Unix (постоянная служба)
  • управление процессами (вилка)
  • анализ текста (чтение текстового файла конфигурации)
  • обработка файлов (I / O)
  • отладка программирования C / C ++ :)

Итак, вам нужно будет узнать о написании базового приложения Unix, программировании сокетов BSD для сетевого программирования TCP / IP и протоколе HTTP.

Обычно используемые тексты включают:

Разработка приложений Unix:

  • Расширенное программирование в среде Unix, Stevens & Rago
  • Расширенное программирование Unix

Программирование TCP / IP (сокетов):

  • Сеть Unix Программирование, Том 1 Стивенс и др.
  • TCP / IP Illustrated, Стивенс
  • Межсетевое взаимодействие с TCP / IP, Том 3, Comer

Протокол HTTP

  • RFC, включая
  • RFC 2616 для HTTP v1 .1,
  • RFC 2068 для pre-v1.1
  • плюс другие в зависимости от поддержки (сжатие, URI / URL) и полноты
39
ответ дан 27 November 2019 в 16:31
поделиться

Замените все нецифровые на пустые: оставшаяся последовательность содержит только цифры.

Integer.parseInt(s.replaceAll("[\\D]", ""))

Это также приведет к удалению нецифровки между цифрами, так что «x1x1x» станет 11 .

Если необходимо подтвердить, что строка состоит из последовательности цифр (по крайней мере, одна), которые, возможно, следуют за буквой, используйте следующее:

s.matches("[\\d]+[A-Za-z]?")
-121--1397848-

Все подробности не могут быть объяснены здесь
Посетите http://www.linuxhowtos.org/C_C++/socket.htm для создания базового сервера с использованием C.
Другой IBM: http://www.ibm.com/developerworks/systems/library/es-nweb/index.html

-121--1298785-

Всегда можно начать с существующей базы кода. boa может быть началом, так как он небольшой, реализован в C и подходит для вашего требования «запуск при загрузке»; подробности приведены, например, в пакете Debian/Ubuntu.

4
ответ дан 27 November 2019 в 16:31
поделиться

Для ПРОСТОГО / БАЗОВОГО / УЛЬТРА-ЛЕГКОГО HTTP-сервера поток программы должен быть примерно таким (в псевдокоде):

----Main thread----
Load settings
while true do
    Wait for connection
    Connection received, create a new thread and transfer this connection to this thread.
end

----Connection thread----
Analyze request
if dynamic content do
    Dump the HTTP request and send it to the interpreter
    Wait for response from the interpreter
    Read response header from the interpreter
    Stream response
else if static content do
    Load requested file
    Stream file content
end
(Optional) Cache the response if size < X
Send the response
Close the socket

Итак, вы следует изучить потоки, межпроцессное взаимодействие (если вы хотите взаимодействовать с интерпретатором), программирование сокетов и протокол HTTP.

18
ответ дан 27 November 2019 в 16:31
поделиться

Здесь невозможно объяснить все подробности
Посетите http://www.linuxhowtos.org/C_C++/socket.htm , чтобы создать базовый сервер с использованием C.
Еще один от IBM: http://www.ibm.com/developerworks/systems/library/es-nweb/index.html

8
ответ дан 27 November 2019 в 16:31
поделиться

http://en.wikipedia.org/wiki/Comparison_of_lightweight_web_servers

СПАСИБО, Википедия

Кстати - вы можете захотеть Google "встроенный веб-сервер с открытым исходным кодом"

(www) .ibm.com / developerworks / web / library / wa-ltwebserv /

4
ответ дан 27 November 2019 в 16:31
поделиться

С помощью библиотеки libevent вы можете написать веб-сервер в 40 строках кода c.

http://www.ruilog.com/article/view/5249.html

Если вы хотите создать его с нуля, вы можете ссылаться на веб-сервер с открытым исходным кодом, написанный на языке c, например lighttpd, apache, nginx.

1
ответ дан 27 November 2019 в 16:31
поделиться