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

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

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

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

27.08.2016, 19:06. Просмотров 344. Ответов 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();
Но несмотря на то что запрос/ответ проходит успешно сервер все равно падает после первого обращения!
В чем может быть причина?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2016, 19:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу (C++):

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

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

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

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

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

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

17
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,127
29.08.2016, 14:31 #2
Ура! Теперь ответ возвращается.

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


Продолжаем следить за ситуацией на АЭС веб-сервере по всем телеканалам страны.
0
Kastaneda
Нарушитель
Эксперт С++
4664 / 2870 / 229
Регистрация: 12.12.2009
Сообщений: 7,299
Записей в блоге: 2
Завершенные тесты: 1
30.08.2016, 16:21 #3
Вот так попробуй
C++
1
boost::thread(boost::bind(client_session, sock)).detach();
0
Nosey
1348 / 399 / 107
Регистрация: 22.10.2014
Сообщений: 861
Завершенные тесты: 2
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/1_37_0...overload2.html
1
Kastaneda
Нарушитель
Эксперт С++
4664 / 2870 / 229
Регистрация: 12.12.2009
Сообщений: 7,299
Записей в блоге: 2
Завершенные тесты: 1
30.08.2016, 17:35 #5
Цитата Сообщение от Nosey Посмотреть сообщение
Браузер получил ответ и разорвал конект -> бросилось исключение.
не факт, браузер обычно шлет заголовок
Код
Connection:keep-alive
что говорит о том, что браузер держит коннект для следующих запросов.
1
Nosey
1348 / 399 / 107
Регистрация: 22.10.2014
Сообщений: 861
Завершенные тесты: 2
30.08.2016, 17:47 #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
не факт, браузер обычно шлет заголовок
Да, не факт, но выхода из client_session отличного от грохнуть приложение нету, так что это большая проблема которая похожа на причину сего поведения.
0
Kastaneda
Нарушитель
Эксперт С++
4664 / 2870 / 229
Регистрация: 12.12.2009
Сообщений: 7,299
Записей в блоге: 2
Завершенные тесты: 1
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
Undisputed
163 / 94 / 19
Регистрация: 10.06.2014
Сообщений: 1,322
Завершенные тесты: 3
30.08.2016, 19:28  [ТС] #10
Уже не падает, мистика... может был какой нибудь конфликт...

Впрочем даже когда оборачивал в try catch то исключение не ловилось интересно почему
0
Nosey
1348 / 399 / 107
Регистрация: 22.10.2014
Сообщений: 861
Завершенные тесты: 2
30.08.2016, 19:35 #11
Цитата Сообщение от sys_beginner Посмотреть сообщение
Впрочем даже когда оборачивал в try catch то исключение не ловилось интересно почему
Случаем не main оборачивали?
0
Undisputed
163 / 94 / 19
Регистрация: 10.06.2014
Сообщений: 1,322
Завершенные тесты: 3
30.08.2016, 19:45  [ТС] #12
Nosey,
Содержимое мейна, сам мейн не оборачивал
0
Nosey
1348 / 399 / 107
Регистрация: 22.10.2014
Сообщений: 861
Завершенные тесты: 2
30.08.2016, 19:59 #13
Цитата Сообщение от sys_beginner Посмотреть сообщение
Содержимое мейна
Этож разные потоки, исключения так не умеют бегать.
Функция потока в контексте исключений это как main - если в верхней функции исключение не поймать отправитесь в std::terminate.
Если очень нужно пробрасывать исключения, то делать это нужно ручками, можете заглянуть сюда: http://en.cppreference.com/w/cpp/error/current_exception
0
Kastaneda
Нарушитель
Эксперт С++
4664 / 2870 / 229
Регистрация: 12.12.2009
Сообщений: 7,299
Записей в блоге: 2
Завершенные тесты: 1
30.08.2016, 20:00 #14
Исключения в другом потоке так не поймаешь, плюс если по дебажному ассерту падает, то catch в любом случае ничего не поймает.
0
Undisputed
163 / 94 / 19
Регистрация: 10.06.2014
Сообщений: 1,322
Завершенные тесты: 3
30.08.2016, 20:58  [ТС] #15
Спасибо. Но почему это разные потоки? У буста ведь написано что он thread safe и насколько я понимаю исключения должны быть пойманы?
0
30.08.2016, 20:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2016, 20:58
Привет! Вот еще темы с ответами:

Boost::asio клиет-сервер - есть ощущение, что где-то что-то блокируется, не знаю как это дебажить - Boost C++
Привет! Область эта для меня новая, поэтому такие вопросы. Смотрите - есть асинхронный сервер(работает на одной io_service) и много...

Проблема с security при первом обращении к .aspx - C# ASP.NET
Установил на Win2003 .Net, создал простейшую .aspx страницу, обращаюсь к ней через Default Web Site. В ответ получаю сообщение: Access to...

Ошибка при обращении к серверу json - PHP
Здравствуйте. При обращении к серверу http://pogoda.ngs.ru/json/ возникает ошибка: Notice: file_get_contents() : Content-type not...

Вылетает приложение при обращении к серверу - Программирование Android
Обращаюсь к серверу для получения списка продуктов. Сервер проверил, JSON ответ в порядке, на IOS работает без проблем. В случае с андроид...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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