Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/47: Рейтинг темы: голосов - 47, средняя оценка - 4.77
2 / 2 / 0
Регистрация: 06.04.2012
Сообщений: 10
1

Простой web-сервер на C++ под Линуксом

13.05.2016, 02:44. Показов 9071. Ответов 3

Author24 — интернет-сервис помощи студентам
Ребятки выручайте, собственно задача - написать простой сервер, отдающий странички(html, php). То что удалось нагуглить либо устаревшее, либо слишком навороченное, либо под винду.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2016, 02:44
Ответы с готовыми решениями:

Простой файловый сервер с Web GUI
Задача поднять простейший файловый сервер с web доступом и сделать это минимальным количеством...

Простой и понятный (с практическими примерами) учебник линукс и WEB сервер
У меня задача построить интернет систему (сайт с кучей клиентов и большой базой данных). Сайт...

Купить ноутбук под Линуксом или под вин-7 и добавить Линукс Минт?
Я звонил продавцам, пытая, что за Линукс установлен, в частности, в «Нотике», ничего...

Создать простой web сервер который мог бы открывать HTML страницу
Привет всем! Помогите создать простой web сервер который мог бы открывать html страничку! Возьмём...

3
2 / 2 / 0
Регистрация: 06.04.2012
Сообщений: 10
15.05.2016, 16:54  [ТС] 2
Нашёл-таки хороший пример на https://habrahabr.ru/post/217437/.
Главный файл выглядит так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "http_server.h"
#include "http_headers.h"
#include "http_content_type.h"
 
#include <iostream>
#include <sstream>
#include <mutex>
 
int main()
{
  char const SrvAddress[] = "127.0.0.1";
  std::uint16_t SrvPort = 5555;
  std::uint16_t SrvThreadCount = 4;
  std::string const RootDir = "../test_content";
  std::string const DefaultPage = "index.html";
  std::mutex Mtx;
  try
  {
    using namespace Network;
    HttpServer Srv(SrvAddress, SrvPort, SrvThreadCount,
      [&] (IHttpRequestPtr req)
      {
        std::string Path = req->GetPath();
        Path = RootDir + Path + (Path == "/" ? DefaultPage : std::string());
        {
          std::stringstream Io;
          Io << "Path: " << Path << std::endl
             << Http::Request::Header::Host::Name << ": "
                  << req->GetHeaderAttr(Http::Request::Header::Host::Value) << std::endl
             << Http::Request::Header::Referer::Name << ": "
                  << req->GetHeaderAttr(Http::Request::Header::Referer::Value) << std::endl;
          std::lock_guard<std::mutex> Lock(Mtx);
          std::cout << Io.str() << std::endl;
        }
        req->SetResponseAttr(Http::Response::Header::Server::Value, "MyTestServer");
        req->SetResponseAttr(Http::Response::Header::ContentType::Value,
                             Http::Content::TypeFromFileName(Path));
        req->SetResponseFile(Path);
      });
    std::cin.get();
  }
  catch (std::exception const &e)
  {
    std::cout << e.what() << std::endl;
  }
  return 0;
}

Подскажите, как-бы теперь прикрутит авторизацию на страничке.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
17.05.2016, 12:35 3
Цитата Сообщение от SENSEi Посмотреть сообщение
Подскажите, как-бы теперь прикрутит авторизацию на страничке.
В HTML рисуешь форму, пусть она шлет данные (логин/пароль) методом POST. На сервере парсишь HTTP заголовки, понимаешь, что это POST, парсишь данные (они будут в виде login=your_login&password=your_password, если поля назовешь login/password), дальше тупое сравнение если логин/пароль совпадают, то отдаешь нужную страницу, если нет, то возвращаешь страницу с нужным сообщением.
1
2 / 2 / 0
Регистрация: 06.04.2012
Сообщений: 10
25.06.2016, 10:53  [ТС] 4
Если вдруг кому-нибудь пригодится вот готовый говнокод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "http_server.h"
#include "http_headers.h"
#include "http_content_type.h"
#include <evhttp.h>
#include <iostream>
#include <mutex>
 
int main()
{
  char const SrvAddress[] = "127.0.0.1";
  std::uint16_t SrvPort = 8888;
  std::uint16_t SrvThreadCount = 1;
  std::string const RootDir = "../content";
  std::string DefaultPage = "index.html";
  int vis[] = {0, 0, 0};
  std::mutex Mtx;
  try
  {
    using namespace Network;
    HttpServer Srv(SrvAddress, SrvPort, SrvThreadCount, [&] (IHttpRequestPtr req)
    {
      auto Params = req->GetParams();
      bool logincheck = false;
      for ( unsigned i = 0; i < Params.bucket_count(); ++i)
      {
        for ( auto local_it = Params.begin(i); local_it!= Params.end(i); ++local_it )
        {
          std::cout << std::endl;
          std::cout << " " << local_it->first << ":" << local_it->second;
          std::cout << std::endl;
          if (local_it->first == "login" && local_it->second == "admin")
          {
            logincheck = true;
          }
          if (local_it->first == "password" && local_it->second == "1234" && logincheck == true)
          {
            DefaultPage = "statistic.html";
            std::string str_fin = "<html><body>Сайт 1: " + std::to_string(vis[0]) +
            " Сайт 2: "+std::to_string(vis[1]) + " Сайт 3: "+std::to_string(vis[2]) +
            "</body></html>";
            req->SetResponseString(str_fin);
          }
        }
      }
      std::string Path = req->GetPath();
      Path = RootDir + Path + (Path == "/" ? DefaultPage : std::string());
      req->SetResponseAttr(Http::Response::Header::ContentType::Value,
                           Http::Content::TypeFromFileName(Path));
      req->SetResponseFile(Path);
      });
      HttpServer Srv2("127.0.0.2", SrvPort, SrvThreadCount, [&] (IHttpRequestPtr req)
      {
        std::string Path = req->GetPath();
        Path = RootDir + Path + (Path == "/" ? "site1.html" : std::string());
        req->SetResponseAttr(Http::Response::Header::ContentType::Value,
                             Http::Content::TypeFromFileName(Path));
        req->SetResponseFile(Path);
        vis[0]++;
        std::cout << "Сайт 1 посещён: "  << vis[0] << std::endl;
      });
      HttpServer Srv3("127.0.0.3", SrvPort, SrvThreadCount, [&] (IHttpRequestPtr req)
      {
        std::string Path = req->GetPath();
        Path = RootDir + Path + (Path == "/" ? "site2.html" : std::string());
        req->SetResponseAttr(Http::Response::Header::ContentType::Value,
                             Http::Content::TypeFromFileName(Path));
        req->SetResponseFile(Path);
        vis[1]++;
        std::cout << "Сайт 2 посещён: " << vis[1] << std::endl;
      });
      HttpServer Srv4("127.0.0.4", SrvPort, SrvThreadCount, [&] (IHttpRequestPtr req)
      {
        std::string Path = req->GetPath();
        Path = RootDir + Path + (Path == "/" ? "site3.html" : std::string());
        req->SetResponseAttr(Http::Response::Header::ContentType::Value,
                             Http::Content::TypeFromFileName(Path));
        req->SetResponseFile(Path);
        vis[2]++;
        std::cout << "Сайт 3 посещён: " << vis[2] << std::endl;
      });
    std::cin.get();
  }
  catch (std::exception const &e)
  {
    std::cout << e.what() << std::endl;
  }
  return 0;
}
Вложения
Тип файла: zip http_srv.zip (69.9 Кб, 74 просмотров)
1
25.06.2016, 10:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2016, 10:53
Помогаю со студенческими работами здесь

Сокеты под линуксом
Всем привет, пишу программу для работы с сокетами (на распберри пи сервер, на мобильном устройстве...

Не собирается проект под линуксом
Здравствуйте!:cry::cry:Такая проблема, есть линь(МСВС). После долгих мучений все заработало, а...

Исследование вируса под линуксом
Специально нашёл на порносайте вируса (у самого система чистая) с именем pornorolic.avi.exe...

COM-port под линуксом: permission denied
При попытке открытия СОМ-порта ловлю ошибку: permission denied Код, которым открываю порт: int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru