2017-10-03 9 views
0
#include <iostream> 
#include <boost/array.hpp> 
#include <boost/asio.hpp> 

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

int main(int argc, char* argv[]) 
{ 
    try 
    { 
    // the user should specify the server - the 2nd argument 
    if (argc != 2) 
    { 
     std::cerr << "Usage: client " << std::endl; 
     return 1; 
    } 

    // Any program that uses asio need to have at least one io_service object 
    boost::asio::io_service io_service; 

    // Convert the server name that was specified as a parameter to the application, to a TCP endpoint. 
    // To do this, we use an ip::tcp::resolver object. 
    tcp::resolver resolver(io_service); 

    // A resolver takes a query object and turns it into a list of endpoints. 
    // We construct a query using the name of the server, specified in argv[1], 
    // and the name of the service, in this case "daytime". 
    tcp::resolver::query query(argv[1], "daytime"); 

    // The list of endpoints is returned using an iterator of type ip::tcp::resolver::iterator. 
    // A default constructed ip::tcp::resolver::iterator object can be used as an end iterator. 
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 

    // Now we create and connect the socket. 
    // The list of endpoints obtained above may contain both IPv4 and IPv6 endpoints, 
    // so we need to try each of them until we find one that works. 
    // This keeps the client program independent of a specific IP version. 
    // The boost::asio::connect() function does this for us automatically. 
    tcp::socket socket(io_service); 
    boost::asio::connect(socket, endpoint_iterator); 

    // The connection is open. All we need to do now is read the response from the daytime service. 
    for (;;) 
    { 
     // We use a boost::array to hold the received data. 
     boost::array <char , 1> buf; 
     boost::system::error_code error; 

     // The boost::asio::buffer() function automatically determines 
     // the size of the array to help prevent buffer overruns. 
     size_t len = socket.read_some(boost::asio::buffer(buf), error); 

     // When the server closes the connection, 
     // the ip::tcp::socket::read_some() function will exit with the boost::asio::error::eof error, 
     // which is how we know to exit the loop. 
     if (error == boost::asio::error::eof) 
     break; // Connection closed cleanly by peer. 
     else if (error) 
     throw boost::system::system_error(error); // Some other error. 

     std::cout.write(buf.data(), len); 
    } 
    } 
    // handle any exceptions that may have been thrown. 
    catch (std::exception& e) 
    { 
    std::cerr << e.what() << std::endl; 
    } 

    return 0; 
} 

しかし、このプログラムをコンパイルすると、次のエラーが発生します。このエラーを取り除くのを手伝ってください。 $ g ++ -lpthread syn_client.cpp -o syn_client.out -lboost_system /usr/bin/ld:/tmp/ccozoiHn.o:未定義のシンボル 'pthread_create @@ GLIBC_2.2.5' /lib/x86_64-linux- GNU/libpthread.so.0:エラーがシンボルを追加:エラー:DSOは、コマンドラインから collect2はを逃しldがboost.asio cppのserver-clientプログラム

答えて

1

1つの終了ステータスが返さpthreadのの一部であり、シンボルのpthread_create、あなたはpthreadのに対してリンクする必要があると言っていますライブラリが見つかりませんでした。システムによっては、-lpthread、-lpthreads、または-pthreadを試してみてください。

関連する問題