2017-07-02 3 views
1

単純なクライアントとサーバーの2つの例を実装しましたが、動作しません。クライアントとサーバーの両方がメッセージを印刷せずにフリーズします。boost.asioを使用してクライアントとサーバー間でデータをやりとりする方法は?

client.cpp

int main(int argc, char * argv[]) 
{ 
std::string raw_ip = "127.0.0.1"; 
int port = 3333; 
try 
    { 
    asio::ip::tcp::endpoint 
     ep(asio::ip::address::from_string(raw_ip), port); 
    asio::io_service ios; 
    asio::ip::tcp::socket sock(ios, ep.protocol()); 
    sock.connect(ep); 

    asio::streambuf request; 
    std::ostream request_stream(&request); 
    request_stream << "request from clinet\n"; 
    asio::streambuf response; 
    asio::read_until(sock, response, "\n"); 
    std::istream response_stream(&response); 
    std::cout << response_stream.rdbuf() << std::endl; 
    } 
    catch(system::system_error &e) 
    { 
    std::cout << "Encounter error: " << e.what() << std::endl; 
    return e.code().value(); 
    } 
} 

server.cpp

int main(int argc, char * argv[]) 
{ 
    std::string raw_ip="127.0.0.1"; 
    int port=3333; 
    try 
    { 
    asio::ip::tcp::endpoint ep(asio::ip::address_v4::any(),port); 
    asio::io_service ios; 
    asio::ip::tcp::acceptor acceptor(ios, ep); 
    acceptor.listen(); 
    asio::ip::tcp::socket sock(ios); 
    acceptor.accept(sock); 
    asio::streambuf request; 
    asio::read_until(sock, request, "\n"); 
    std::istream request_stream(&request); 
    std::cout << request_stream.rdbuf() << std::endl; 

    asio::streambuf response; 
    std::ostream response_stream(&response); 
    response_stream << "response from server\n"; 
    } 
    catch(system::system_error &e) 
    { 
    std::cout << e.what() << std::endl; 
    return -1; 
    } 
    return 0; 
} 

はまた、私はどのように我々はそのIソケットを教えてください、ソケットから/への大量のデータを転送するための最良の方法を疑問に思ってソケットにデータを書き込んでいますか?そして、ソケットからデータの最後のバイトを読み取ったことをどのように知っていますか?ありがとう。

+0

いくつかのメタデータも送信します。つまり、どれだけのデータを期待するかを相手側に伝えます。 –

答えて

1

ブロッキング関数 'ios.run()in both the client and server to animate boost :: io_service`を呼び出す必要があります。いずれにせよ、私はあなたのアプリがそのまま使えるものを生み出すとは思わない。あなたはasioの例の1つを出発点として試してみるべきです。

TCPブロッキングエコークライアント/サーバの例は、あなたがやりたいことの出発点になるはずです。 TCP接続で

http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/example/cpp11/echo/blocking_tcp_echo_server.cpp

http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/example/cpp11/echo/blocking_tcp_echo_client.cpp、あなたはすべてのデータを確実にするために、単一のASIOバッファを使用することができますが送信されます。しかし、クライアントにあらかじめメッセージを送信して、受け取るべきデータの量を知っておく必要があります。

+0

ありがとう、tcpのエコーの例は実際に多くの洞察を与えます。私は、ソケットにデータを書き込んだら、もう一度、いくつかの方法があることを認識しています。1、tcpメッセージを送信します(asioでこれを行う方法はわかりません。ソケット3は、ルールbtwクライアントとサーバーを定義します。 – Blake

+0

この例では、TCPメッセージを前後に送信します。 –

関連する問題