Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для uburuntu
95 / 95 / 58
Регистрация: 04.10.2012
Сообщений: 189

Boost::Asio Сделать так, чтобы сервер отвечал на запросы из браузера

21.07.2017, 14:18. Показов 1799. Ответов 2

Студворк — интернет-сервис помощи студентам
Добрый день!

Взял один из примеров Boost по асинхронным серверам. Данный код сервера-клиента отправляет сообщение от клиента, а потом получает его обратно от сервера и печатает. Такой вот echo.
Но стало интересно как обойтись без клиента, а запросы отправлять прямо из браузера, к примеру с запросом в адресной строке по 127.0.0.1:2012

server.cpp

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <cstdlib>
#include <iostream>
#include <memory>
#include <utility>
#include <boost/asio.hpp>
 
using boost::asio::ip::tcp;
 
class session
  : public std::enable_shared_from_this<session>
{
  public:
    session (tcp::socket socket)
      : socket_ (std::move (socket))
    {
    }
 
    void start()
    {
      do_read();
    }
 
  private:
    void do_read()
    {
      auto self (shared_from_this());
      socket_.async_read_some (boost::asio::buffer (data_, max_length),
                               [this, self] (boost::system::error_code ec, std::size_t length)
      {
        if (!ec)
          {
            do_write (length);
          }
      });
    }
 
    void do_write (std::size_t length)
    {
      auto self (shared_from_this());
      boost::asio::async_write (socket_, boost::asio::buffer (data_, length),
                                [this, self] (boost::system::error_code ec, std::size_t /*length*/)
      {
        if (!ec)
          {
            do_read();
          }
      });
    }
 
    tcp::socket socket_;
    enum { max_length = 1024 };
    char data_[max_length];
};
 
class server
{
  public:
    server (boost::asio::io_service &io_service, short port)
      : acceptor_ (io_service, tcp::endpoint (tcp::v4(), port)),
        socket_ (io_service)
    {
      do_accept();
    }
 
  private:
    void do_accept()
    {
      acceptor_.async_accept (socket_,
                              [this] (boost::system::error_code ec)
      {
        if (!ec)
          {
            std::make_shared<session> (std::move (socket_))->start();
          }
 
        do_accept();
      });
    }
 
    tcp::acceptor acceptor_;
    tcp::socket socket_;
};
 
int main (int argc, char *argv[])
{
  try
    {
      if (argc != 2)
        {
          std::cerr << "Usage: async_tcp_echo_server <port>\n";
          return 1;
        }
 
      boost::asio::io_service io_service;
 
      server s (io_service, std::atoi (argv[1]));
 
      io_service.run();
    }
  catch (std::exception &e)
    {
      std::cerr << "Exception: " << e.what() << "\n";
    }
 
  return 0;
}


client.cpp

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
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <boost/asio.hpp>
 
using boost::asio::ip::tcp;
 
enum { max_length = 1024 };
 
int main (int argc, char *argv[])
{
  try
    {
      if (argc != 3)
        {
          std::cerr << "Usage: blocking_tcp_echo_client <host> <port>\n";
          return 1;
        }
 
      boost::asio::io_service io_service;
 
      tcp::socket s (io_service);
      tcp::resolver resolver (io_service);
      boost::asio::connect (s, resolver.resolve ({argv[1], argv[2]}));
 
      std::cout << "Enter message: ";
      char request[max_length];
      std::cin.getline (request, max_length);
      size_t request_length = std::strlen (request);
      boost::asio::write (s, boost::asio::buffer (request, request_length));
 
      char reply[max_length];
      size_t reply_length = boost::asio::read (s,
                            boost::asio::buffer (reply, request_length));
      std::cout << "Reply is: ";
      std::cout.write (reply, reply_length);
      std::cout << "\n";
    }
  catch (std::exception &e)
    {
      std::cerr << "Exception: " << e.what() << "\n";
    }
 
  return 0;
}


Компилируются просто:
Code
1
g++ server.cpp -std=c++14 -lboost_system -o server
Code
1
g++ client.cpp -std=c++14 -lboost_system -lpthread -o client
В сетевых приложениях только начинаю разбираться, поэтому не ругайте сильно.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.07.2017, 14:18
Ответы с готовыми решениями:

Как сделать, чтобы finger-сервер отвечал на запросы клиента?
Как поднять под Ubuntu 12.10 сервер finger, чтобы он отвечал на запросы клиента?

Mongoose vs Boost.Asio (веб-сервер)
Требуется прикрутить легковесный и быстрый веб-сервер с json для встраиваемой железки на Linux. Нашел интересное решение mongoose,...

Асинхронный сервер и клиент Boost Asio
Здравствуйте. Попробовал написать нечто такое. Но на этом этапе чтения не происходит ничего. Дальше std::cout&lt;&lt;&quot;Server: I...

2
1 / 1 / 1
Регистрация: 23.05.2017
Сообщений: 15
22.07.2017, 14:12
сейчас как раз делаю тестовое задание на эту тему
из браузера посылаю такой запрос

http://127.0.0.1:8282/get/test.txt
читаю я на сервере так
C++
1
asio::async_read_until( socket_, in_packet_, "\r\n\r\n", handler);
что интересно сначала приходит GET, при повторном чтении /get/test.txt и при последующих служебная браузерная информация.
дальше паршу(сю?) эту строку и делаю что мне нужно.
Сейчас разбираюсь как отправлять ответ браузеру, собственно простой html с ошибкой или файл отправить у меня уже получается, а вот вместе и html о успешном начале скачивании и сам файл пока не получается.
Еще простые файлы доходят нормально, а попробовал pdf передавая за раз по 3 байта, получил битый, но то уже нюансы
0
Заблокирован
22.07.2017, 14:17
uburuntu, нужно писать -pthread, а не -lpthread
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.07.2017, 14:17
Помогаю со студенческими работами здесь

Обратный прокси-сервер с использованием boost::asio
Добрый день. Задача - написать обратный прокси-сервер. Использую boost::asio. При написании собственного клиента к серверу данные передатся...

Как сделать http запрос в boost.asio?
Здравствуйте. Как сделать запрос в с++ пользуясь boost asio Например на c# все просто. WebRequest request =...

Boost::Asio клиент - сервер: При вводе с телнета на стороне сервера появляется куча крякозябр
Раньше использовал Code::Blocks и winsock. Сейчас решил попробовать VS2013 и библиотеку boost::asio Проблема в передачи данных. Проверял...

Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу
Запускаю код указанный ниже, но при обращении на айпи и порт который слушает сервер, сервер падает (debug error, abord) А браузер пишет...

Оператор if. Что сделать, чтобы он отвечал не по три сообщения подряд?
Как поставить несколько операторов if подряд if (Edit1-&gt;Text == &quot;привет&quot; ) ListBox1-&gt;Items-&gt;Add(&quot;Гомер: привет!&quot;); ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru