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

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

Восстановить пароль Регистрация
 
sys_beginner
1 / 5 / 1
Регистрация: 10.06.2014
Сообщений: 461
27.08.2016, 19:06     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #1
Запускаю код указанный ниже, но при обращении на айпи и порт который слушает сервер, сервер падает (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 падает именно при первом же обращении к серверу
Посмотрите здесь:

C++ Данные на сервер передаются, но PHP не понимает что пришел именно файл..
C++ Простой класс на основе заданной структуры данных с++
Как корректно считать вектор boost::asio::streambuf на стороне клиента C++
Boost::asio как обнаружить дисконнект на удалённой машине? C++
Как написать простой веб сервер C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
29.08.2016, 14:31     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #2
Ура! Теперь ответ возвращается.

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


Продолжаем следить за ситуацией на АЭС веб-сервере по всем телеканалам страны.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
30.08.2016, 16:21     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #3
Вот так попробуй
C++
1
boost::thread(boost::bind(client_session, sock)).detach();
Nosey
 Аватар для Nosey
1184 / 351 / 102
Регистрация: 22.10.2014
Сообщений: 786
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
30.08.2016, 17:35     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #5
Цитата Сообщение от Nosey Посмотреть сообщение
Браузер получил ответ и разорвал конект -> бросилось исключение.
не факт, браузер обычно шлет заголовок
Код
Connection:keep-alive
что говорит о том, что браузер держит коннект для следующих запросов.
Nosey
 Аватар для Nosey
1184 / 351 / 102
Регистрация: 22.10.2014
Сообщений: 786
Завершенные тесты: 2
30.08.2016, 17:47     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
не факт, браузер обычно шлет заголовок
Да, не факт, но выхода из client_session отличного от грохнуть приложение нету, так что это большая проблема которая похожа на причину сего поведения.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 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)
а, блин, смотрю в книгу - вижу фигу. Да, тут по-любому эксепшн кидается.

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

Впрочем даже когда оборачивал в try catch то исключение не ловилось интересно почему
Nosey
 Аватар для Nosey
1184 / 351 / 102
Регистрация: 22.10.2014
Сообщений: 786
Завершенные тесты: 2
30.08.2016, 19:35     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #11
Цитата Сообщение от sys_beginner Посмотреть сообщение
Впрочем даже когда оборачивал в try catch то исключение не ловилось интересно почему
Случаем не main оборачивали?
sys_beginner
1 / 5 / 1
Регистрация: 10.06.2014
Сообщений: 461
30.08.2016, 19:45  [ТС]     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #12
Nosey,
Содержимое мейна, сам мейн не оборачивал
Nosey
 Аватар для Nosey
1184 / 351 / 102
Регистрация: 22.10.2014
Сообщений: 786
Завершенные тесты: 2
30.08.2016, 19:59     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #13
Цитата Сообщение от sys_beginner Посмотреть сообщение
Содержимое мейна
Этож разные потоки, исключения так не умеют бегать.
Функция потока в контексте исключений это как main - если в верхней функции исключение не поймать отправитесь в std::terminate.
Если очень нужно пробрасывать исключения, то делать это нужно ручками, можете заглянуть сюда: http://en.cppreference.com/w/cpp/err...rent_exception
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
30.08.2016, 20:00     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #14
Исключения в другом потоке так не поймаешь, плюс если по дебажному ассерту падает, то catch в любом случае ничего не поймает.
sys_beginner
1 / 5 / 1
Регистрация: 10.06.2014
Сообщений: 461
30.08.2016, 20:58  [ТС]     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #15
Спасибо. Но почему это разные потоки? У буста ведь написано что он thread safe и насколько я понимаю исключения должны быть пойманы?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
30.08.2016, 21:04     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #16
Цитата Сообщение от sys_beginner Посмотреть сообщение
Но почему это разные потоки?
потому что ты руками создаешь новый поток на каждое подключение (строка 32 в первом посте).
Цитата Сообщение от sys_beginner Посмотреть сообщение
У буста ведь написано что он thread safe
thread safe означает, что он(кстати кто "он"?)) безопасен для для использования в параллельных потоках, но это не значит, что он не кидает исключения.

Добавлено через 1 минуту
что значит thread safe
Nosey
 Аватар для Nosey
1184 / 351 / 102
Регистрация: 22.10.2014
Сообщений: 786
Завершенные тесты: 2
30.08.2016, 21:08     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #17
sys_beginner, Вы совсем запутались.
Попробуйте почитать пару статей по исключениям/многопоточности, а лучше пару книг, и постарайтесь помедитировать и познать дзэн С++, не отчаивайтесь когда поймёте, что нифига не знаете и нифига не может познать этого дзэна дзэн С++ это вещь недостижимая, но попытаться обязательно нужно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2016, 21:13     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу
Еще ссылки по теме:

C++ Пул потоков на основе boost::lockfree::queue
О memcopy, а именно об ее первом параметре void *dst C++
C++ Boost - asio | Подключение к серверу ВКонтакте

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

Или воспользуйтесь поиском по форуму:
sys_beginner
1 / 5 / 1
Регистрация: 10.06.2014
Сообщений: 461
30.08.2016, 21:13  [ТС]     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу #18
Да...Запутался, буду учиться ) спасибо за помощь
Yandex
Объявления
30.08.2016, 21:13     Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу
Ответ Создать тему
Опции темы

Текущее время: 00:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru