2011-09-14 10 views
3

アプリケーションでコード例を使用しようとしています。接続クライアントは「hello!」を送信します。サーバーに送信します。サーバーはそれを受信して​​何らかの形でそれに応答します( "Hi、client!I'm server!")。その後、クライアントとtelnetの両方のメッセージを受信(印刷)します。Boost :: asio:他の接続が発生した後にのみデータが受信される

クライアント:

socket.connect(tcp::endpoint(tcp::v4(), 21), error); 
if (error) 
    throw boost::system::system_error(error); 
boost::asio::write(socket, boost::asio::buffer("Hello!\n"), boost::asio::transfer_all(), ignored_error); 
for (;;) 
{ 
    boost::array<char, 128> buf; 
    boost::system::error_code error; 

    size_t len = socket.read_some(boost::asio::buffer(buf), error); 

    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); 
} 

サーバー:

for (;;) 
{ 
    tcp::socket socket(io_service); 
    acceptor.accept(socket); 
    for (;;) 
    { 
     boost::array<char, 128> buf; 
     boost::system::error_code error; 
     size_t len = socket.read_some(boost::asio::buffer(buf), error); 

     if (buf[len-1] == '/n') 
      break; // Connection closed cleanly by peer. 
     else if (error) 
      throw boost::system::system_error(error); // Some other error. 
     std::string a(buf.data()); 
    } 

    std::string message = make_daytime_string(); 
    boost::system::error_code ignored_error; 
    boost::asio::write(socket, boost::asio::buffer("Hi, client! I'm server!"), 
    boost::asio::transfer_all(), ignored_error); 
} 

私は(ソケットのように)閉じるように何かを忘れてしまったんです。しかし、とにかく - そしてアイデア?

+0

あなたの書き戻しはコメントアウトされていますが、サーバーは、読み込みエラーを受け取ったときにのみ破棄される 'for(;;) 'のためにクライアントが切断されるまで書き込みを実行しようとしません。正確に何を期待していますか? – Chad

+0

右。そしてこの方法? –

+0

サーバの設定で、単一の接続を受け入れる 'acceptor'があります。接続が確立されると、サーバーは接続が閉じられるまで 'read_some()'関数を使って接続されたアプリケーションから読み込みます。その接続が閉じられると、サーバは 'write()'を使ってクライアントにデータを書き戻そうとします。その後、サーバーは追加の接続を受け入れます。これらは、期待される行動の記述が一致しないようです。 – Chad

答えて

1
size_t len = socket.read_some(boost::asio::buffer(buf), error); 

if (buf[len-1] == '/n') 

あなたはnot trueあるtcp::ip::socket::read_some()に関するいくつかの仮定を行いました。

備考

read_some動作が バイトの要求された数のすべてを読んでいないことがあります。ブロック操作 が完了する前に、 要求されたデータ量が読み取られるようにする必要がある場合は、read functionを使用することを検討してください。

read()free functionは、ドキュメントに記載されているとおりに使用することをお勧めします。

関連する問題