Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Undisputed
142 / 73 / 16
Регистрация: 10.06.2014
Сообщений: 1,150
Завершенные тесты: 3
#1

Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу - C++

27.08.2016, 19:06. Просмотров 311. Ответов 17
Метки нет (Все метки)

Запускаю код указанный ниже, но при обращении на айпи и порт который слушает сервер, сервер падает (debug error, abord)
А браузер пишет 127.0.0.1 refused to connect.

Что я делаю не так? Программа слушает 2011 порт, обращаюсь из браузера так: 127.0.0.1:2011
Возвращаю корректный ответ клиенту по протоколу HTTP

До запроса к серверу он нормально живет и слушает порт 2011 (проверял). Падает именно при первом же обращении к серверу

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
#include "stdafx.h"
#include <iostream>
#include <boost/asio/impl/src.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/write.hpp>
#include <boost/thread.hpp>
 
typedef boost::shared_ptr<boost::asio::ip::tcp::socket> socket_ptr;
 
std::string response = "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length:2\r\n\r\n ok";
 
void client_session(socket_ptr sock)
{
   while (true)
   {
    char data[512];
    size_t len = sock->read_some(boost::asio::buffer(data));
    if (len > 0)
        boost::asio::write(*sock, boost::asio::buffer(response, sizeof(response)));//возвращаю ответ здесь
    }
}
 
int main()
{
   boost::asio::io_service service;
   boost::asio::ip::tcp::endpoint ep(boost::asio::ip::tcp::v4(), 2011);
   boost::asio::ip::tcp::acceptor acc(service, ep);
   while (true)
   {
    socket_ptr sock(new boost::asio::ip::tcp::socket(service));
    acc.accept(*sock);
    boost::thread(boost::bind(client_session, sock));
   }
 
    return 0;
}
Добавлено через 8 минут
Убрал while(true) в функции client_session, теперь страница отображается в браузере но возвращаемый ответ с сервера все равно не виден. Тело ответа пустое

Добавлено через 3 минуты
Ура! Теперь ответ возвращается. Нужно было вместо sizeof(response) написать response.length();
Но несмотря на то что запрос/ответ проходит успешно сервер все равно падает после первого обращения!
В чем может быть причина?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2016, 19:06     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу
Посмотрите здесь:

Boost - asio | Подключение к серверу ВКонтакте - C++
Доброго времени суток! Хотелось бы узнать как можно подключится к серверу ВКонтакте средствами буста? (asio) Заранее спасибо. ...

Как написать простой веб сервер - C++
Доброго времени суток. Цель: разгрызть веб, написав программу-веб сервер. Суть: С браузера клиента захожу на IP сервера. Тот отправляет...

Boost::asio как обнаружить дисконнект на удалённой машине? - C++
В данный момент обрабатываю дисконнекты, глядя на возвращаемые коды ошибок после вызовов read(socket,...) и write(socket, ...) Проблема в...

Как корректно считать вектор boost::asio::streambuf на стороне клиента - C++
Доброго времени суток! Назрел вопрос: Пишу в сокет с помощью boost::asio::buffer std::vector&lt;double&gt;. а вот как на стороне клиента...

О memcopy, а именно об ее первом параметре void *dst - C++
Доброго времени суток. Не подскажете, как можно модернезировать код, что бы обойтись без лишнего new char, раз уж там все равно CString...

Решить проблему с деструктором класса Student - C++
Добрый день! Хотел написать простенький класс, но возникла проблема с деструктором. Подскажите, пожалуйста, в чём ошибка. Если деструктор...

Пул потоков на основе boost::lockfree::queue - C++
В книге &quot;Энтони Уильямс - Параллельное программирование на С++ в действии&quot; обсуждается пул потоков на основе самописной потокобезопасной...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
29.08.2016, 14:31     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #2
Ура! Теперь ответ возвращается.

сервер все равно падает после первого обращения!


Продолжаем следить за ситуацией на АЭС веб-сервере по всем телеканалам страны.
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,250
Записей в блоге: 1
Завершенные тесты: 1
30.08.2016, 16:21     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #3
Вот так попробуй
C++
1
boost::thread(boost::bind(client_session, sock)).detach();
Nosey
1346 / 397 / 107
Регистрация: 22.10.2014
Сообщений: 861
Завершенные тесты: 2
30.08.2016, 17:30     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #4
sys_beginner, А ответ еще нужен?

www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/reference/basic_stream_socket/read_some/overload1.html

Цитата Сообщение от sys_beginner Посмотреть сообщение
size_t len = sock->read_some(boost::asio::buffer(data));
This function is used to read data from the stream socket. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
....
Exceptions
boost::system::system_error
Thrown on failure. An error code of boost::asio::error::eof indicates that the connection was closed by the peer.
Цитата Сообщение от sys_beginner Посмотреть сообщение
Но несмотря на то что запрос/ответ проходит успешно сервер все равно падает после первого обращения!
Ну т.е. это нормально поведение. Браузер получил ответ и разорвал конект -> бросилось исключение. Да и вообще в бусте любят исключения, иногда даже слишком - обязательно документацию читайте.
Например вот есть перегруженный read : http://www.boost.org/doc/libs/1_37_0...overload2.html
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,250
Записей в блоге: 1
Завершенные тесты: 1
30.08.2016, 17:35     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #5
Цитата Сообщение от Nosey Посмотреть сообщение
Браузер получил ответ и разорвал конект -> бросилось исключение.
не факт, браузер обычно шлет заголовок
Код
Connection:keep-alive
что говорит о том, что браузер держит коннект для следующих запросов.
Nosey
1346 / 397 / 107
Регистрация: 22.10.2014
Сообщений: 861
Завершенные тесты: 2
30.08.2016, 17:47     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
не факт, браузер обычно шлет заголовок
Да, не факт, но выхода из client_session отличного от грохнуть приложение нету, так что это большая проблема которая похожа на причину сего поведения.
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,250
Записей в блоге: 1
Завершенные тесты: 1
30.08.2016, 17:55     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #7
Nosey, почему, read_some читает не до EOF, он просто читает доступные в буфере данные и возвращает управление.
Проще в отладчике запустить и посмотреть где падает, но мне лень
Nosey
30.08.2016, 18:01
  #8

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
почему, read_some читает не до EOF, он просто читает доступные в буфере данные и возвращает управление.
На сцену выходит главный фокусник-чудесник-while(true)

Kastaneda
30.08.2016, 18:03
  #9

Не по теме:

Цитата Сообщение от Nosey Посмотреть сообщение
На сцену выходит главный фокусник-чудесник-while(true)
а, блин, смотрю в книгу - вижу фигу. Да, тут по-любому эксепшн кидается.

Undisputed
142 / 73 / 16
Регистрация: 10.06.2014
Сообщений: 1,150
Завершенные тесты: 3
30.08.2016, 19:28  [ТС]     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #10
Уже не падает, мистика... может был какой нибудь конфликт...

Впрочем даже когда оборачивал в try catch то исключение не ловилось интересно почему
Nosey
1346 / 397 / 107
Регистрация: 22.10.2014
Сообщений: 861
Завершенные тесты: 2
30.08.2016, 19:35     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #11
Цитата Сообщение от sys_beginner Посмотреть сообщение
Впрочем даже когда оборачивал в try catch то исключение не ловилось интересно почему
Случаем не main оборачивали?
Undisputed
142 / 73 / 16
Регистрация: 10.06.2014
Сообщений: 1,150
Завершенные тесты: 3
30.08.2016, 19:45  [ТС]     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #12
Nosey,
Содержимое мейна, сам мейн не оборачивал
Nosey
1346 / 397 / 107
Регистрация: 22.10.2014
Сообщений: 861
Завершенные тесты: 2
30.08.2016, 19:59     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #13
Цитата Сообщение от sys_beginner Посмотреть сообщение
Содержимое мейна
Этож разные потоки, исключения так не умеют бегать.
Функция потока в контексте исключений это как main - если в верхней функции исключение не поймать отправитесь в std::terminate.
Если очень нужно пробрасывать исключения, то делать это нужно ручками, можете заглянуть сюда: http://en.cppreference.com/w/cpp/err...rent_exception
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,250
Записей в блоге: 1
Завершенные тесты: 1
30.08.2016, 20:00     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #14
Исключения в другом потоке так не поймаешь, плюс если по дебажному ассерту падает, то catch в любом случае ничего не поймает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2016, 20:58     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу
Еще ссылки по теме:

Простой класс на основе заданной структуры данных с++ - C++
Помогите пожалуйста... Необходимо разработать программу, реализующую простой класс на основе заданной структуры данных.

Данные на сервер передаются, но PHP не понимает что пришел именно файл.. - C++
Нужно: передать файл (картинка.жпг) на сервер методом POST (принимает индекс.пхп) Делаю: HINTERNET m_hInternet; HINTERNET...

Решить систему с простой переменной - C++
Помогите решить систему с простой переменной... Надо найти x, заранее спс=)

При обращении к структуре из класса возникает исключение:нарушение прав доступа при записи. Почему? - C++
Структура Test описана в классе ABC: class ABC{ struct Test { int get_i() { return i; } void put_i(int j) { i = j;} ...

Ошибка при обращении к классу - C++
Есть класс для хранения элементов, к которым должен быть доступ из других классов - решил объявить как глобальный: Items.h: class...


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

Или воспользуйтесь поиском по форуму:
Undisputed
142 / 73 / 16
Регистрация: 10.06.2014
Сообщений: 1,150
Завершенные тесты: 3
30.08.2016, 20:58  [ТС]     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #15
Спасибо. Но почему это разные потоки? У буста ведь написано что он thread safe и насколько я понимаю исключения должны быть пойманы?
Yandex
Объявления
30.08.2016, 20:58     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru