Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Boost web client error (newbee)

Reply
Thread Tools

Boost web client error (newbee)

 
 
Xan
Guest
Posts: n/a
 
      04-11-2012
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: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:laceholders::error,
boost::asio:laceholders::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:laceholders::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:laceholders::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:laceholders::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:laceholders::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:laceholders::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:laceholders::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:laceholders::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:osix_tss_ptr<boost::asio::d etail::call_stack<boost::asio::detail::strand_serv ice::strand_impl>::context>::~posix_tss_ptr()':
b.cpp:
(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10 call_stackINS1_14strand_service11strand_implEE7con textEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_st ackINS1_14strand_service11strand_implEE7contextEED 2Ev]
+0x1: undefined reference to `pthread_key_delete'
/tmp/cc-u4FMYi.o: In function
`boost::asio::detail:osix_tss_ptr_create(unsigne d int&)':
b.cpp:
(.text._ZN5boost4asio6detail20posix_tss_ptr_create ERj[_ZN5boost4asio6detail20posix_tss_ptr_createERj]
+0x33): undefined reference to `pthread_key_create'
/tmp/cc-u4FMYi.o: In function
`boost::asio::detail:osix_tss_ptr<boost::asio::d etail::call_stack<boost::asio::detail::task_io_ser vice>::context>::~posix_tss_ptr()':
b.cpp:
(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10 call_stackINS1_15task_io_serviceEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_st ackINS1_15task_io_serviceEE7contextEED2Ev]
+0x1: 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:osix_tss_ptr<boost::asio::d etail::call_stack<boost::asio::detail::task_io_ser vice>::context>:perator=(boost::asio::detail::ca ll_stack<boost::asio::detail::task_io_service>::co ntext*)':
b.cpp:
(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10 call_stackINS1_15task_io_serviceEE7contextEEaSEPS6 _[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_st ackINS1_15task_io_serviceEE7contextEEaSEPS6_]
+0x22): undefined reference to `pthread_setspecific'
/tmp/cc-u4FMYi.o: In function
`boost::asio::detail:osix_tss_ptr<boost::asio::d etail::call_stack<boost::asio::detail::task_io_ser vice>::context>:perator
boost::asio::detail::call_stack<boost::asio::detai l::task_io_service>::context*()
const':
b.cpp:
(.text._ZNK5boost4asio6detail13posix_tss_ptrINS1_1 0call_stackINS1_15task_io_serviceEE7contextEEcvPS6 _Ev[_ZNK5boost4asio6detail13posix_tss_ptrINS1_10call_s tackINS1_15task_io_serviceEE7contextEEcvPS6_Ev]
+0x15): undefined reference to `pthread_getspecific'
/tmp/cc-u4FMYi.o: In function
`boost::asio::detail:osix_thread::start_thread(b oost::asio::detail:osix_thread::func_base*)':
b.cpp:
(.text._ZN5boost4asio6detail12posix_thread12start_ threadEPNS2_9func_baseE[_ZN5boost4asio6detail12posix_thread12start_threadE PNS2_9func_baseE]
+0x3b): undefined reference to `pthread_create'
/tmp/cc-u4FMYi.o: In function
`boost::asio::detail:osix_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:osix_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.
 
Reply With Quote
 
 
 
 
Victor Bazarov
Guest
Posts: n/a
 
      04-11-2012
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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Boost::any and boost::lambda with std::find_if Misiu C++ 3 01-31-2007 05:46 PM
#include <boost/shared_ptr.hpp> or #include "boost/shared_ptr.hpp"? Colin Caughie C++ 1 08-29-2006 02:19 PM
Problems mixing boost::lambda::bind and boost::shared_ptr.. Toby Bradshaw C++ 6 06-02-2006 04:12 PM
Any Boost Experts out there for Boost.Regex? Richard Latter C++ 2 05-17-2004 03:12 PM
Boost + Python C/API: Mixing python return types with boost return types Steve Knight Python 2 10-10-2003 10:11 AM



Advertisments