Boost::asio::read
От: st0nx  
Дата: 25.02.11 08:31
Оценка:
void HttpSendRecv_boost::SendHTTP(char * host,char * ref,char * uAgent)
{
    boost::system::error_code error;
    GET_COOKIE();
    rStr.clear();
    GET_TEXT(host,ref,uAgent);
    boost::asio::write(* socket, request);
    boost::array<char, 124> buf;
    boost::asio::read_until(*socket, response, "\r\n");
    std::istream response_stream(&response);
    std::string http_version;
    response_stream >> http_version;
    unsigned int status_code;
    response_stream >> status_code;

        if(status_code == 200)
        {
    

            while(boost::asio::read(*socket,boost::asio::buffer(buf),boost::asio::transfer_at_least(1), error))
            {
                if(len<124)
                {

                }
                rStr+=buf.data();
                std::cout << buf.data();
            }
        }
};


Доброго времени суток. Вообщем выше описанна функция, отсылает ХТТП запрос ну и получает страницу. Так вот, пробовал получать страницы различных сайтов в итоге программа не доходя до конца страницы(всегда разное кол-во байт считанных от 9000 до 30000) зависала на read(видимо ждала остальные куски). Объясните... может я что не так делаю, что у меня в сокет приходит не вся страница? Ниже код GET запроса:


void HttpSendRecv_boost::GET_TEXT(char * host,char * ref,char * uAgent)
{
std::ostream request_stream(&request);
request_stream << "GET "<< boost::lexical_cast<std::string>(ref) <<" HTTP/1.1\r\n";
request_stream << "Host: "<<boost::lexical_cast<std::string>(host)<<"\r\n";
request_stream << "User-Agent: "<<boost::lexical_cast<std::string>(uAgent)<<"\r\n";
request_stream << "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
request_stream << "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
request_stream << "Accept-Encoding: gzip,deflate\r\n";
request_stream << "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n";
request_stream << "Keep-Alive: 300\r\n";
request_stream << "Connection: keep-alive\r\n";
int vSize = (int)cookie.size();
if(vSize>0)
{
    request_stream << "Cookie: ";
    for(int i=0;i<vSize;i++)
    {
        request_stream << cookie[i].a <<"="<<cookie[i].b;
    }
}
request_stream <<"\r\n";
};
Re: Boost::asio::read
От: Cris Украина  
Дата: 25.02.11 08:58
Оценка:
если я не забыл то нужно заключать Boost:asio:read не в цикл, а сначала узнавать размер пакета и записывать его в переменную, а потом уже по этой переменной считывать, это если сокет блокирующий, если не блокирующий будет то должно заработать.
Re: Boost::asio::read
От: Mazay Россия  
Дата: 25.02.11 09:47
Оценка:
Здравствуйте, st0nx, Вы писали:

Сначала сделай проверку на код ошибки в error.
Потом свой логирующий функтор вместо transfer_at_least.
Что такое len?
Подозрительно выглядит код
rStr+=buf.data();

buf.data() точно нулём заканчивается? Помоему нифига.
Главное гармония ...
Re[2]: Boost::asio::read
От: st0nx  
Дата: 01.03.11 14:22
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Здравствуйте, st0nx, Вы писали:


M>Сначала сделай проверку на код ошибки в error.

M>Потом свой логирующий функтор вместо transfer_at_least.
M>Что такое len?
M>Подозрительно выглядит код
M>
M>rStr+=buf.data();
M>

M>buf.data() точно нулём заканчивается? Помоему нифига.

Написал такой функтор:

std::size_t HttpSendRecv_boost::read_hd(const boost::system::error_code &e,std::size_t bytes_transferred)
{

        // где то тут я должен вернуть сколько байт надо прочитать и как то проверить залочится или нет
        if(!e)
        {
        std::cout << buf.data();    

        boost::asio::read(*socket,
                          boost::asio::buffer(buf),
                          boost::bind(&HttpSendRecv_boost::read_hd,this,boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));

        }

};


читаю из сокета так:


void HttpSendRecv_boost::SendHTTP(char * host,char * ref,char * uAgent)
{
    boost::system::error_code error;
    GET_COOKIE();
    rStr.clear();
    GET_TEXT(host,ref,uAgent);
    boost::asio::write(* socket, request);
     

      
        boost::asio::read_until(*socket, response, "\r\n");
        std::istream response_stream(&response);
        std::string http_version;
        response_stream >> http_version;
        unsigned int status_code;
        response_stream >> status_code;



        if(status_code == 200)
        {

        

        boost::asio::read(*socket,
                          boost::asio::buffer(buf),
                          boost::bind(&HttpSendRecv_boost::read_hd,this,boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));

        }
        
};


Вопрос: Как я узнаю, что функция заблокируется?
Такое сравнение:
 e == boost::asio::error::would_block

Ничего не дает
Re[3]: Boost::asio::read
От: Mazay Россия  
Дата: 01.03.11 15:00
Оценка:
Здравствуйте, st0nx, Вы писали:

S>Здравствуйте, Mazay, Вы писали:


M>>Здравствуйте, st0nx, Вы писали:


M>>Сначала сделай проверку на код ошибки в error.

M>>Потом свой логирующий функтор вместо transfer_at_least.
M>>Что такое len?
M>>Подозрительно выглядит код
M>>
M>>rStr+=buf.data();
M>>

M>>buf.data() точно нулём заканчивается? Помоему нифига.

S>Написал такой функтор:


S>
S>std::size_t HttpSendRecv_boost::read_hd(const boost::system::error_code &e,std::size_t bytes_transferred)
//skip
S>


S>читаю из сокета так:



S>
S>void HttpSendRecv_boost::SendHTTP(char * host,char * ref,char * uAgent)
S>{
//skip
S>        boost::asio::read(*socket,
S>                          boost::asio::buffer(buf),
S>                          boost::bind(&HttpSendRecv_boost::read_hd,this,boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));
S>        }        
S>};
S>


S>Вопрос: Как я узнаю, что функция заблокируется?

S>Такое сравнение:
S>
S> e == boost::asio::error::would_block
S>

S>Ничего не дает

Какое отношение этот код имеет к первоначальной задаче?
Какая функция заблокируется? asio::read с функтором вообще никогда не блокируется, в этом же весь цимес.
Ты попробовал сделать то что я выше написал? Какие результаты?
Главное гармония ...
Re[4]: Boost::asio::read
От: st0nx  
Дата: 02.03.11 06:21
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Какое отношение этот код имеет к первоначальной задаче?

M>Какая функция заблокируется? asio::read с функтором вообще никогда не блокируется, в этом же весь цимес.
M>Ты попробовал сделать то что я выше написал? Какие результаты?

Видимо я не совсем понимаю, что есть функтор. Не могли бы вы, небольшим примером, подсказать? На boost.org среди примеров asio ничего подобного найти не могу.
Re[5]: Boost::asio::read
От: Mazay Россия  
Дата: 02.03.11 08:30
Оценка:
Здравствуйте, st0nx, Вы писали:

S>Здравствуйте, Mazay, Вы писали:


M>>Какое отношение этот код имеет к первоначальной задаче?

M>>Какая функция заблокируется? asio::read с функтором вообще никогда не блокируется, в этом же весь цимес.
M>>Ты попробовал сделать то что я выше написал? Какие результаты?

S>Видимо я не совсем понимаю, что есть функтор. Не могли бы вы, небольшим примером, подсказать? На boost.org среди примеров asio ничего подобного найти не могу.


Функтор
Главное гармония ...
Re[6]: Boost::asio::read
От: st0nx  
Дата: 02.03.11 14:02
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Здравствуйте, st0nx, Вы писали:


S>>Здравствуйте, Mazay, Вы писали:


M>>>Какое отношение этот код имеет к первоначальной задаче?

M>>>Какая функция заблокируется? asio::read с функтором вообще никогда не блокируется, в этом же весь цимес.
M>>>Ты попробовал сделать то что я выше написал? Какие результаты?

S>>Видимо я не совсем понимаю, что есть функтор. Не могли бы вы, небольшим примером, подсказать? На boost.org среди примеров asio ничего подобного найти не могу.


M>Функтор


Описание с boost.org:

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:


    std::size_t completion_condition(
      // Result of latest read_some operation.
      const boost::system::error_code& error,

      // Number of bytes transferred so far.
      std::size_t bytes_transferred
    );



A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read_some function.

Сделал все как там написанно (ошибок в "e" не бывает я проверял):


void HttpSendRecv_boost::SendHTTP(char * host,char * ref,char * uAgent)
{
        boost::system::error_code error;
        GET_COOKIE();
        rStr.clear();
        GET_TEXT(host,ref,uAgent);
        boost::asio::write(* socket, request);
            boost::asio::read_until(*socket, response, "\r\n");
        std::istream response_stream(&response);
            std::string http_version;
        response_stream >> http_version;
        unsigned int status_code;
        response_stream >> status_code;

        if(status_code == 200)
        {
        boost::asio::read(*socket,
        response,
                boost::bind(&HttpSendRecv_boost::read_hd,
                                       this,
                                       boost::asio::placeholders::error,
                                       boost::asio::placeholders::bytes_transferred),
                error);
        }
};


std::size_t HttpSendRecv_boost::read_hd(const boost::system::error_code &e,std::size_t bytes_transferred)
{
cout << &response;
return (std::size_t)1024;
};


Итогом получил, то что приходит вся страница, а на последней итерации блокировка(а все потому, что я должен был вернуть 0 судя по ману. ) Так вот как узнать что данных в сокете больше нету?
Re[7]: Boost::asio::read
От: Mazay Россия  
Дата: 02.03.11 14:21
Оценка:
Здравствуйте, st0nx, Вы писали:

S>Сделал все как там написанно (ошибок в "e" не бывает я проверял):


S>
S>void HttpSendRecv_boost::SendHTTP(char * host,char * ref,char * uAgent)
S>{
S>        boost::system::error_code error;
S>        GET_COOKIE();
S>        rStr.clear();
S>        GET_TEXT(host,ref,uAgent);
S>        boost::asio::write(* socket, request);
S>            boost::asio::read_until(*socket, response, "\r\n");
S>        std::istream response_stream(&response);
S>            std::string http_version;
S>        response_stream >> http_version;
S>        unsigned int status_code;
S>        response_stream >> status_code;

S>        if(status_code == 200)
S>        {
S>        boost::asio::read(*socket,
S>        response,
S>                boost::bind(&HttpSendRecv_boost::read_hd,
S>                                       this,
S>                                       boost::asio::placeholders::error,
S>                                       boost::asio::placeholders::bytes_transferred),
S>                error);
S>        }
S>};

S>std::size_t HttpSendRecv_boost::read_hd(const boost::system::error_code &e,std::size_t bytes_transferred)
S>{
S>cout << &response;
S>return (std::size_t)1024;
S>};
S>


S>Итогом получил, то что приходит вся страница, а на последней итерации блокировка(а все потому, что я должен был вернуть 0 судя по ману. ) Так вот как узнать что данных в сокете больше нету?


Уже лучше. TCP — это в первую очередь поток, у него нет понятия передаваемого объема.
Покажи HTTP запрос.
Главное гармония ...
Re[8]: Boost::asio::read
От: Mazay Россия  
Дата: 02.03.11 14:22
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Уже лучше. TCP — это в первую очередь поток, у него нет понятия передаваемого объема.

M>Покажи HTTP запрос.

И заголовки ответа тоже.
Главное гармония ...
Re[9]: Boost::asio::read
От: st0nx  
Дата: 03.03.11 06:28
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Здравствуйте, Mazay, Вы писали:


M>>Уже лучше. TCP — это в первую очередь поток, у него нет понятия передаваемого объема.

M>>Покажи HTTP запрос.

M>И заголовки ответа тоже.


Вариант 1:

Request

GET / HTTP/1.1
Host: www.rsdn.org
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Connection: close



Response

HTTP/1.1 200 OK
Via: 1.1 FT02
Connection: close
Proxy-Connection: close
Content-Length: 1672
Date: Thu, 03 Mar 2011 06:17:38 GMT
Content-Type: text/html; charset=utf-8
Server: nginx/0.7.63
Cache-Control: private
X-AspNet-Version: 2.0.50727
Set-Cookie: .ASPXANONYMOUS=xTJRqv3wywEkAAAANzg3ZDhjZDgtYjg1Mi00MTc2LWI5YTktYjBiNjgzMzEyMWIxK9hhWfmnVwjy_lIvT6uSgoZim2Q1; domain=rsdn.ru; expires=Sat, 02-Apr-2011 06:17:38 GMT; path=/; HttpOnly
Set-Cookie: ASP.NET_SessionId=1coxtq55iro3q255fr32hfak; path=/; HttpOnly
X-Powered-By: ASP.NET


Вариант 2:

Request

GET / HTTP/1.1
Host: www.rsdn.org
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive


Response

HTTP/1.1 200 OK
Via: 1.1 FT02
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Content-Length: 1672
Date: Thu, 03 Mar 2011 06:22:57 GMT
Content-Type: text/html; charset=utf-8
Server: nginx/0.7.63
Cache-Control: private
X-AspNet-Version: 2.0.50727
Set-Cookie: .ASPXANONYMOUS=OTs0aP7wywEkAAAAY2Q2NTAyODUtOWIxZS00MThkLTlmZmQtNzg4NzdiOWVjMzQ2vZovBfOVvYVOXMFN_uV_TfH3L0s1; domain=rsdn.ru; expires=Sat, 02-Apr-2011 06:22:57 GMT; path=/; HttpOnly
Set-Cookie: ASP.NET_SessionId=ss44e1e02z3nepyf3bm5ro55; path=/; HttpOnly
X-Powered-By: ASP.NET

Re[10]: Boost::asio::read
От: Mazay Россия  
Дата: 03.03.11 07:49
Оценка:
Здравствуйте, st0nx, Вы писали:

S>Здравствуйте, Mazay, Вы писали:


M>>Здравствуйте, Mazay, Вы писали:


M>>>Уже лучше. TCP — это в первую очередь поток, у него нет понятия передаваемого объема.

M>>>Покажи HTTP запрос.

M>>И заголовки ответа тоже.


S>Вариант 1:


S>Request


S>

S>GET / HTTP/1.1
S>Host: www.rsdn.org
S>User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16
S>Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
S>Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
S>Accept-Encoding: gzip,deflate
S>Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
S>Connection: close


Вот здесь соединение должно закрываться само (Connection: close), когда приходят все данные. При этом asio должна вернуть ошибку в error_code то ли при чтении последней порции данных, то ли при попытке чтения на закрытом соединении (то есть после последней порции). Таким образом, если в HttpSendRecv_boost::read_hd пришла ненулевая ошибка, то возвращаем 0 и больше не читаем.


S>Response


S>

S>HTTP/1.1 200 OK
S>Via: 1.1 FT02
S>Connection: close
S>Proxy-Connection: close
S>Content-Length: 1672
S>Date: Thu, 03 Mar 2011 06:17:38 GMT
S>Content-Type: text/html; charset=utf-8
S>Server: nginx/0.7.63
S>Cache-Control: private
S>X-AspNet-Version: 2.0.50727
S>Set-Cookie: .ASPXANONYMOUS=xTJRqv3wywEkAAAANzg3ZDhjZDgtYjg1Mi00MTc2LWI5YTktYjBiNjgzMzEyMWIxK9hhWfmnVwjy_lIvT6uSgoZim2Q1; domain=rsdn.ru; expires=Sat, 02-Apr-2011 06:17:38 GMT; path=/; HttpOnly
S>Set-Cookie: ASP.NET_SessionId=1coxtq55iro3q255fr32hfak; path=/; HttpOnly
S>X-Powered-By: ASP.NET


S>Вариант 2:


S>Request


S>

S>GET / HTTP/1.1
S>Host: www.rsdn.org
S>User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16
S>Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
S>Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
S>Accept-Encoding: gzip,deflate
S>Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
S>Keep-Alive: 300
S>Connection: keep-alive


S>Response


S>

S>HTTP/1.1 200 OK
S>Via: 1.1 FT02
S>Connection: Keep-Alive
S>Proxy-Connection: Keep-Alive
S>Content-Length: 1672
S>Date: Thu, 03 Mar 2011 06:22:57 GMT
S>Content-Type: text/html; charset=utf-8
S>Server: nginx/0.7.63
S>Cache-Control: private
S>X-AspNet-Version: 2.0.50727
S>Set-Cookie: .ASPXANONYMOUS=OTs0aP7wywEkAAAAY2Q2NTAyODUtOWIxZS00MThkLTlmZmQtNzg4NzdiOWVjMzQ2vZovBfOVvYVOXMFN_uV_TfH3L0s1; domain=rsdn.ru; expires=Sat, 02-Apr-2011 06:22:57 GMT; path=/; HttpOnly
S>Set-Cookie: ASP.NET_SessionId=ss44e1e02z3nepyf3bm5ro55; path=/; HttpOnly
S>X-Powered-By: ASP.NET


А здесь соединение не закроется, потому что Connection: keep-alive. Потому нужно смотреть заголовок ответа: Content-Length: 1672. Это размер данных после заголовка. Просто читаешь из сокета, пока не получишь весь объём.

Покури примеры внимательно:
http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/example/http/client/sync_client.cpp
http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/example/http/client/async_client.cpp
Главное гармония ...
Re[11]: Boost::asio::read
От: st0nx  
Дата: 03.03.11 07:56
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Здравствуйте, st0nx, Вы писали:


S>>Здравствуйте, Mazay, Вы писали:


M>>>Здравствуйте, Mazay, Вы писали:


M>>>>Уже лучше. TCP — это в первую очередь поток, у него нет понятия передаваемого объема.

M>>>>Покажи HTTP запрос.

M>>>И заголовки ответа тоже.


S>>Вариант 1:


S>>Request


S>>

S>>GET / HTTP/1.1
S>>Host: www.rsdn.org
S>>User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16
S>>Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
S>>Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
S>>Accept-Encoding: gzip,deflate
S>>Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
M>S>Connection: close


M>Вот здесь соединение должно закрываться само (Connection: close), когда приходят все данные. При этом asio должна вернуть ошибку в error_code то ли при чтении последней порции данных, то ли при попытке чтения на закрытом соединении (то есть после последней порции). Таким образом, если в HttpSendRecv_boost::read_hd пришла ненулевая ошибка, то возвращаем 0 и больше не читаем.



S>>Response


S>>

S>>HTTP/1.1 200 OK
S>>Via: 1.1 FT02
S>>Connection: close
S>>Proxy-Connection: close
S>>Content-Length: 1672
S>>Date: Thu, 03 Mar 2011 06:17:38 GMT
S>>Content-Type: text/html; charset=utf-8
S>>Server: nginx/0.7.63
S>>Cache-Control: private
S>>X-AspNet-Version: 2.0.50727
S>>Set-Cookie: .ASPXANONYMOUS=xTJRqv3wywEkAAAANzg3ZDhjZDgtYjg1Mi00MTc2LWI5YTktYjBiNjgzMzEyMWIxK9hhWfmnVwjy_lIvT6uSgoZim2Q1; domain=rsdn.ru; expires=Sat, 02-Apr-2011 06:17:38 GMT; path=/; HttpOnly
S>>Set-Cookie: ASP.NET_SessionId=1coxtq55iro3q255fr32hfak; path=/; HttpOnly
S>>X-Powered-By: ASP.NET


S>>Вариант 2:


S>>Request


S>>

S>>GET / HTTP/1.1
S>>Host: www.rsdn.org
S>>User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16
S>>Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
S>>Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
S>>Accept-Encoding: gzip,deflate
S>>Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
S>>Keep-Alive: 300
M>S>Connection: keep-alive


S>>Response


S>>

S>>HTTP/1.1 200 OK
S>>Via: 1.1 FT02
S>>Connection: Keep-Alive
S>>Proxy-Connection: Keep-Alive
M>S>Content-Length: 1672
S>>Date: Thu, 03 Mar 2011 06:22:57 GMT
S>>Content-Type: text/html; charset=utf-8
S>>Server: nginx/0.7.63
S>>Cache-Control: private
S>>X-AspNet-Version: 2.0.50727
S>>Set-Cookie: .ASPXANONYMOUS=OTs0aP7wywEkAAAAY2Q2NTAyODUtOWIxZS00MThkLTlmZmQtNzg4NzdiOWVjMzQ2vZovBfOVvYVOXMFN_uV_TfH3L0s1; domain=rsdn.ru; expires=Sat, 02-Apr-2011 06:22:57 GMT; path=/; HttpOnly
S>>Set-Cookie: ASP.NET_SessionId=ss44e1e02z3nepyf3bm5ro55; path=/; HttpOnly
S>>X-Powered-By: ASP.NET


M>А здесь соединение не закроется, потому что Connection: keep-alive. Потому нужно смотреть заголовок ответа: Content-Length: 1672. Это размер данных после заголовка. Просто читаешь из сокета, пока не получишь весь объём.


M>Покури примеры внимательно:

M>http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/example/http/client/sync_client.cpp
M>http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/example/http/client/async_client.cpp


Спасибо большое! Разобрался!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.