Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
1

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

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

Author24 — интернет-сервис помощи студентам
Запускаю код указанный ниже, но при обращении на айпи и порт который слушает сервер, сервер падает (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();
Но несмотря на то что запрос/ответ проходит успешно сервер все равно падает после первого обращения!
В чем может быть причина?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2016, 19:06
Ответы с готовыми решениями:

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

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

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

Асинхронный сервер и клиент Boost Asio
Здравствуйте. Попробовал написать нечто такое. Но на этом этапе чтения не происходит ничего. Дальше...

17
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
29.08.2016, 14:31 2
Ура! Теперь ответ возвращается.

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


Продолжаем следить за ситуацией на АЭС веб-сервере по всем телеканалам страны.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
30.08.2016, 16:21 3
Вот так попробуй
C++
1
boost::thread(boost::bind(client_session, sock)).detach();
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
30.08.2016, 17:30 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/... load2.html
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
30.08.2016, 17:35 5
Цитата Сообщение от Nosey Посмотреть сообщение
Браузер получил ответ и разорвал конект -> бросилось исключение.
не факт, браузер обычно шлет заголовок
Код
Connection:keep-alive
что говорит о том, что браузер держит коннект для следующих запросов.
1
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
30.08.2016, 17:47 6
Цитата Сообщение от Kastaneda Посмотреть сообщение
не факт, браузер обычно шлет заголовок
Да, не факт, но выхода из client_session отличного от грохнуть приложение нету, так что это большая проблема которая похожа на причину сего поведения.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
30.08.2016, 17:55 7
Nosey, почему, read_some читает не до EOF, он просто читает доступные в буфере данные и возвращает управление.
Проще в отладчике запустить и посмотреть где падает, но мне лень
0
Nosey
30.08.2016, 18:01
  #8

Не по теме:

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

0
Kastaneda
30.08.2016, 18:03
  #9

Не по теме:

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

0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
30.08.2016, 19:28  [ТС] 10
Уже не падает, мистика... может был какой нибудь конфликт...

Впрочем даже когда оборачивал в try catch то исключение не ловилось интересно почему
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
30.08.2016, 19:35 11
Цитата Сообщение от sys_beginner Посмотреть сообщение
Впрочем даже когда оборачивал в try catch то исключение не ловилось интересно почему
Случаем не main оборачивали?
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
30.08.2016, 19:45  [ТС] 12
Nosey,
Содержимое мейна, сам мейн не оборачивал
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
30.08.2016, 19:59 13
Цитата Сообщение от sys_beginner Посмотреть сообщение
Содержимое мейна
Этож разные потоки, исключения так не умеют бегать.
Функция потока в контексте исключений это как main - если в верхней функции исключение не поймать отправитесь в std::terminate.
Если очень нужно пробрасывать исключения, то делать это нужно ручками, можете заглянуть сюда: http://en.cppreference.com/w/c... _exception
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
30.08.2016, 20:00 14
Исключения в другом потоке так не поймаешь, плюс если по дебажному ассерту падает, то catch в любом случае ничего не поймает.
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
30.08.2016, 20:58  [ТС] 15
Спасибо. Но почему это разные потоки? У буста ведь написано что он thread safe и насколько я понимаю исключения должны быть пойманы?
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
30.08.2016, 21:04 16
Цитата Сообщение от sys_beginner Посмотреть сообщение
Но почему это разные потоки?
потому что ты руками создаешь новый поток на каждое подключение (строка 32 в первом посте).
Цитата Сообщение от sys_beginner Посмотреть сообщение
У буста ведь написано что он thread safe
thread safe означает, что он(кстати кто "он"?)) безопасен для для использования в параллельных потоках, но это не значит, что он не кидает исключения.

Добавлено через 1 минуту
что значит thread safe
1
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
30.08.2016, 21:08 17
sys_beginner, Вы совсем запутались.
Попробуйте почитать пару статей по исключениям/многопоточности, а лучше пару книг, и постарайтесь помедитировать и познать дзэн С++, не отчаивайтесь когда поймёте, что нифига не знаете и нифига не может познать этого дзэна дзэн С++ это вещь недостижимая, но попытаться обязательно нужно.
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
30.08.2016, 21:13  [ТС] 18
Да...Запутался, буду учиться ) спасибо за помощь
0
30.08.2016, 21:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2016, 21:13
Помогаю со студенческими работами здесь

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

При обращение к серверу клиента, сервер падает без каких видемых причин
В общем я нашёл чат, на скринах показанно что чат работает, но вот беда при обращение к серверу...

Boost::Asio Сделать так, чтобы сервер отвечал на запросы из браузера
Добрый день! Взял один из примеров Boost по асинхронным серверам. Данный код сервера-клиента...

Синтаксические ошибки при сборке проекта с использованием Boost.Asio
Логи 1&gt;------ Build started: Project: ConsoleApplication4, Configuration: Debug Win32 ------...


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

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