LINUX.ORG.RU

Boost asio для начинающих

 ,


0

2

Здравствуйте,

Начал попытку изучить основы boost asio и и сразу же появились вопросы :( Если есть возможность подскажите пожалуйста:

1)Я так и не могу понять, как работает функция read, то есть, как они понимает, что чтение пора завершать и передавать действие следующей строчке кода ? Единственно, что я смог заметить, это, если делать get http запрос в сторону сервера и указать Connection: close, то чтение read`ом происходит сразу и быстро, если же не указать Connection: close, то функция «чего то» ждет секунд 30 и только потом завершается. Из этого получаются еще вот такие вопросы: 2)Судя по всему функция read ждет отключения соединения со стороны сервера и только после этого считает, что все данные считаны, потому что у read_untill такой «проблемы» нет.

И иcходя из этого еще получаются вот такие вопросы: 3)Вообще по http 1.1, если я правильно понимаю, если не указать Connection: close, то сервер не должен закрывать соединение и должен его держать чуть ли не до второго пришествия, но в моем случае, соединение скорее всего закрывалось, хотя сервер и присылал «Connection: keep-alive», вопрос почему ? Или все таки это было не закрытие присоединения ?

4)И что такие вообще закрытие присоединения со стороны сервера , что это значит ? То есть, я создаю обьект boost socket, socket.open(), socket.conection() далее пишу в сокет, get запрос, пишу Connection: close, чтобы сервер закрыт соединение после того, как передаст всю инфу на мой get запрос, далее от сервера приходит так же Connection: close. Далее я проверю открыт ли мой сокет:

cout<< socket.is_open()<<endl;

И ответ: 1

то есть сокет открыт, что тогда такое Connection: close ??

5)Если в http 1.1 предусмотрен режим постоянного соединения, то, возвращаясь к самому первому вопросу, как работает read, как read понимает, или должен понимать, что все данные записаны и пора передавать команду следующей строчки кода ?

Как то вот такие вопросы получились, не судите строга пожалуйста :)



Последнее исправление: Optimus1 (всего исправлений: 1)

Ответ на: комментарий от anonymous

Блин, я конечно понимаю, что это не мое, но как я из хендлера достану это значение ? Async_resolve дополнительные параметры в себя не принимает, массив туда передать вроде как нельзя.

Optimus1
() автор топика
Ответ на: комментарий от Optimus1

Хендлер - не обязательно простая функция. Это может быть замыкание, захватившее массив, например. Или метод класса, содержащего массив.

auto handler = [&results](const boost::system::error_code& error, tcp::resolver::iterator endpoint_iterator)
{
  ...
  results.push_back(endo_pointo);
}
anonymous
()
Ответ на: комментарий от anonymous

Или метод класса

Скорее, не метод класса (хотя тоже можно), а объект класса с перегруженным operator(). Функциональный объект.

struct Handler
{
  std::vector<...> results;

  void operator()(const boost::system::error_code& error, tcp::resolver::iterator endpoint_iterator)
  {
    results.push_back(...);
  }
};

...
Handler handler_resolve;
resolvers.async_resolve(query, handler_resolve);
anonymous
()
Ответ на: комментарий от anonymous

Boost asio acceptor прием/отправка сообщения

Здравствуйте,

1)Взял простой boost`овский пример эхо-сервера, который принимает сообщение и передают обратно «Hello World». На компьютерных браузерах все работает, браузеры отображают «Hello World», на мобильных браузерах почему то нет, они ждут и почему то ничего не отображают. В чем может быть причина ? Вот мой код:

int main()
{
        int port;
    port = 80;
 
    boost::system::error_code ec_acceptor;
    ///////////////////
    boost::asio::io_service io_services;
 
    boost::asio::ip::tcp::acceptor Acceptorka(io_services);
    boost::asio::ip::tcp::endpoint endpointo_acceptor(boost::asio::ip::tcp::v4(), port);
    tcp::acceptor the_acceptor(io_services, endpointo_acceptor);
    tcp::socket socket_acceptor(io_services);
 
    the_acceptor.accept(socket_acceptor);
       
        boost::asio::streambuf Response_read_acceptor; // объявим буффер
        boost::asio::read_until(socket_acceptor, Response_read_acceptor, "\r\n", ec_acceptor); // Читаем Входяший запрос
       
        ///// Пришел GET запрос от браузера ....
 
       //// Отправляю ответ:
 
        string response_text_1 = "Hello World";
 
    boost::asio::write(socket_acceptor, boost::asio::buffer(response_text_1));
    socket_acceptor.shutdown(boost::asio::ip::tcp::socket::shutdown_send);
    socket_acceptor.close();
}

На буке на хроме и интернет-експлорере все работает, сообщение приходит. На том же хроме на телефоне, нет ниче, хотя сам запрос пришел, и комманда boost::asio::write - отработана, но мобильный браузер почему то не хочет отображать сообщение.
2)И если не сложно подскажите пожалуйста еще, как можно получить сам IP с которого пришел запрос ?
Пробывал так:
cout<<endpointo_acceptor.to_string()<<endl;

Но так не работает, выводит просто все нули.
Optimus1
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.