Boost web client error (newbee)

Discussion in 'C++' started by Xan, Apr 11, 2012.

  1. Xan

    Xan Guest

    Hi,

    I'm a newbee of C++. I want to make a web client with boost libraries.
    I have ubuntu (libboost1.46-dev) and I follow the example that appear
    in boost web page:

    #include <iostream>
    #include <istream>
    #include <ostream>
    #include <string>
    #include <boost/asio.hpp>
    #include <boost/bind.hpp>

    using boost::asio::ip::tcp;

    class client
    {
    public:
    client(boost::asio::io_service& io_service,
    const std::string& server, const std::string& path)
    : resolver_(io_service),
    socket_(io_service)
    {
    // Form the request. We specify the "Connection: close" header so
    that the
    // server will close the socket after transmitting the response.
    This will
    // allow us to treat all data up until the EOF as the content.
    std::eek:stream request_stream(&request_);
    request_stream << "GET " << path << " HTTP/1.0\r\n";
    request_stream << "Host: " << server << "\r\n";
    request_stream << "Accept: */*\r\n";
    request_stream << "Connection: close\r\n\r\n";

    // Start an asynchronous resolve to translate the server and
    service names
    // into a list of endpoints.
    tcp::resolver::query query(server, "http");
    resolver_.async_resolve(query,
    boost::bind(&client::handle_resolve, this,
    boost::asio::placeholders::error,
    boost::asio::placeholders::iterator));
    }

    private:
    void handle_resolve(const boost::system::error_code& err,
    tcp::resolver::iterator endpoint_iterator)
    {
    if (!err)
    {
    // Attempt a connection to the first endpoint in the list. Each
    endpoint
    // will be tried until we successfully establish a connection.
    tcp::endpoint endpoint = *endpoint_iterator;
    socket_.async_connect(endpoint,
    boost::bind(&client::handle_connect, this,
    boost::asio::placeholders::error, ++endpoint_iterator));
    }
    else
    {
    std::cout << "Error: " << err.message() << "\n";
    }
    }

    void handle_connect(const boost::system::error_code& err,
    tcp::resolver::iterator endpoint_iterator)
    {
    if (!err)
    {
    // The connection was successful. Send the request.
    boost::asio::async_write(socket_, request_,
    boost::bind(&client::handle_write_request, this,
    boost::asio::placeholders::error));
    }
    else if (endpoint_iterator != tcp::resolver::iterator())
    {
    // The connection failed. Try the next endpoint in the list.
    socket_.close();
    tcp::endpoint endpoint = *endpoint_iterator;
    socket_.async_connect(endpoint,
    boost::bind(&client::handle_connect, this,
    boost::asio::placeholders::error, ++endpoint_iterator));
    }
    else
    {
    std::cout << "Error: " << err.message() << "\n";
    }
    }

    void handle_write_request(const boost::system::error_code& err)
    {
    if (!err)
    {
    // Read the response status line. The response_ streambuf will
    // automatically grow to accommodate the entire line. The growth
    may be
    // limited by passing a maximum size to the streambuf
    constructor.
    boost::asio::async_read_until(socket_, response_, "\r\n",
    boost::bind(&client::handle_read_status_line, this,
    boost::asio::placeholders::error));
    }
    else
    {
    std::cout << "Error: " << err.message() << "\n";
    }
    }

    void handle_read_status_line(const boost::system::error_code& err)
    {
    if (!err)
    {
    // Check that response is OK.
    std::istream response_stream(&response_);
    std::string http_version;
    response_stream >> http_version;
    unsigned int status_code;
    response_stream >> status_code;
    std::string status_message;
    std::getline(response_stream, status_message);
    if (!response_stream || http_version.substr(0, 5) != "HTTP/")
    {
    std::cout << "Invalid response\n";
    return;
    }
    if (status_code != 200)
    {
    std::cout << "Response returned with status code ";
    std::cout << status_code << "\n";
    return;
    }

    // Read the response headers, which are terminated by a blank
    line.
    boost::asio::async_read_until(socket_, response_, "\r\n\r\n",
    boost::bind(&client::handle_read_headers, this,
    boost::asio::placeholders::error));
    }
    else
    {
    std::cout << "Error: " << err << "\n";
    }
    }

    void handle_read_headers(const boost::system::error_code& err)
    {
    if (!err)
    {
    // Process the response headers.
    std::istream response_stream(&response_);
    std::string header;
    while (std::getline(response_stream, header) && header != "\r")
    std::cout << header << "\n";
    std::cout << "\n";

    // Write whatever content we already have to output.
    if (response_.size() > 0)
    std::cout << &response_;

    // Start reading remaining data until EOF.
    boost::asio::async_read(socket_, response_,
    boost::asio::transfer_at_least(1),
    boost::bind(&client::handle_read_content, this,
    boost::asio::placeholders::error));
    }
    else
    {
    std::cout << "Error: " << err << "\n";
    }
    }

    void handle_read_content(const boost::system::error_code& err)
    {
    if (!err)
    {
    // Write all of the data that has been read so far.
    std::cout << &response_;

    // Continue reading remaining data until EOF.
    boost::asio::async_read(socket_, response_,
    boost::asio::transfer_at_least(1),
    boost::bind(&client::handle_read_content, this,
    boost::asio::placeholders::error));
    }
    else if (err != boost::asio::error::eof)
    {
    std::cout << "Error: " << err << "\n";
    }
    }

    tcp::resolver resolver_;
    tcp::socket socket_;
    boost::asio::streambuf request_;
    boost::asio::streambuf response_;
    };

    int main(int argc, char* argv[])
    {
    try
    {
    if (argc != 3)
    {
    std::cout << "Usage: async_client <server> <path>\n";
    std::cout << "Example:\n";
    std::cout << " async_client www.boost.org /LICENSE_1_0.txt\n";
    return 1;
    }

    boost::asio::io_service io_service;
    client c(io_service, argv[1], argv[2]);
    io_service.run();
    }
    catch (std::exception& e)
    {
    std::cout << "Exception: " << e.what() << "\n";
    }

    return 0;
    }


    but I receive these errors:


    /tmp/cc-u4FMYi.o: In function `__cxx_global_var_init1':
    b.cpp:(.text+0x57): undefined reference to
    `boost::system::generic_category()'
    /tmp/cc-u4FMYi.o: In function `__cxx_global_var_init2':
    b.cpp:(.text+0x77): undefined reference to
    `boost::system::generic_category()'
    /tmp/cc-u4FMYi.o: In function `__cxx_global_var_init3':
    b.cpp:(.text+0x97): undefined reference to
    `boost::system::system_category()'
    /tmp/cc-u4FMYi.o: In function
    `boost::asio::error::get_system_category()':
    b.cpp:
    (.text._ZN5boost4asio5error19get_system_categoryEv[_ZN5boost4asio5error19get_system_categoryEv]
    +0x7): undefined reference to `boost::system::system_category()'
    /tmp/cc-u4FMYi.o: In function
    `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::strand_service::strand_impl>::context>::~posix_tss_ptr()':
    b.cpp:
    (.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEED2Ev]
    +0x18): undefined reference to `pthread_key_delete'
    /tmp/cc-u4FMYi.o: In function
    `boost::asio::detail::posix_tss_ptr_create(unsigned int&)':
    b.cpp:
    (.text._ZN5boost4asio6detail20posix_tss_ptr_createERj[_ZN5boost4asio6detail20posix_tss_ptr_createERj]
    +0x33): undefined reference to `pthread_key_create'
    /tmp/cc-u4FMYi.o: In function
    `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context>::~posix_tss_ptr()':
    b.cpp:
    (.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEED2Ev]
    +0x18): undefined reference to `pthread_key_delete'
    /tmp/cc-u4FMYi.o: In function
    `boost::system::error_code::error_code()':
    b.cpp:
    (.text._ZN5boost6system10error_codeC2Ev[_ZN5boost6system10error_codeC2Ev]
    +0x19): undefined reference to `boost::system::system_category()'
    /tmp/cc-u4FMYi.o: In function
    `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context>::eek:perator=(boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context*)':
    b.cpp:
    (.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEEaSEPS6_[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEEaSEPS6_]
    +0x22): undefined reference to `pthread_setspecific'
    /tmp/cc-u4FMYi.o: In function
    `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context>::eek:perator
    boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context*()
    const':
    b.cpp:
    (.text._ZNK5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEEcvPS6_Ev[_ZNK5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEEcvPS6_Ev]
    +0x15): undefined reference to `pthread_getspecific'
    /tmp/cc-u4FMYi.o: In function
    `boost::asio::detail::posix_thread::start_thread(boost::asio::detail::posix_thread::func_base*)':
    b.cpp:
    (.text._ZN5boost4asio6detail12posix_thread12start_threadEPNS2_9func_baseE[_ZN5boost4asio6detail12posix_thread12start_threadEPNS2_9func_baseE]
    +0x3b): undefined reference to `pthread_create'
    /tmp/cc-u4FMYi.o: In function
    `boost::asio::detail::posix_thread::~posix_thread()':
    b.cpp:
    (.text._ZN5boost4asio6detail12posix_threadD2Ev[_ZN5boost4asio6detail12posix_threadD2Ev]
    +0x2c): undefined reference to `pthread_detach'
    /tmp/cc-u4FMYi.o: In function
    `boost::asio::detail::posix_thread::join()':
    b.cpp:
    (.text._ZN5boost4asio6detail12posix_thread4joinEv[_ZN5boost4asio6detail12posix_thread4joinEv]
    +0x3c): undefined reference to `pthread_join'
    clang: error: linker command failed with exit code 1 (use -v to see
    invocation)



    What can I do?
    This bunch of errors overpasses me ;-)

    Thanks in advance,
    Xan.
     
    Xan, Apr 11, 2012
    #1
    1. Advertising

  2. On 4/11/2012 3:02 PM, Xan wrote:
    > I'm a newbee of C++. I want to make a web client with boost libraries.
    > I have ubuntu (libboost1.46-dev) and I follow the example that appear
    > in boost web page:
    >
    > [...code...]
    >
    > but I receive these errors:
    >
    >
    > /tmp/cc-u4FMYi.o: In function `__cxx_global_var_init1':
    > b.cpp:(.text+0x57): undefined reference to
    > `boost::system::generic_category()'
    > [...more errors...]
    >
    >
    > What can I do?
    > This bunch of errors overpasses me ;-)


    Do what I do in a situation like this (when there are too many errors):
    deal with the first one and compile again. Undefined reference is most
    likely due to the inability of your linker to locate the library where
    the symbol is defined. Did you give the compiler the location of the
    library where boost parts live? If you did, check it. If you didn't,
    try again.

    In general those things are not mistakes you made in your C++ code, but
    mistakes in installing some third-party components or mistakes in using
    the tools (the compiler in our case). Both are pretty much off-topic
    here. So, make sure you install Boost correctly and tell the compiler
    where your installation of Boost is. How? I don't know. It's actually
    beyond the scope of comp.lang.c++

    Good luck!

    V
    --
    I do not respond to top-posted replies, please don't ask
     
    Victor Bazarov, Apr 11, 2012
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Richard Latter
    Replies:
    2
    Views:
    2,923
    Julie
    May 17, 2004
  2. Steve Knight
    Replies:
    2
    Views:
    799
    Steve Knight
    Oct 10, 2003
  3. Toby Bradshaw
    Replies:
    6
    Views:
    1,799
    Kai-Uwe Bux
    Jun 2, 2006
  4. Colin Caughie
    Replies:
    1
    Views:
    751
    Shooting
    Aug 29, 2006
  5. Misiu
    Replies:
    3
    Views:
    2,431
    Misiu
    Jan 31, 2007
Loading...

Share This Page