0

boost に含まれているクライアント サンプルを変更しました。handle_handshake メソッドでリクエストを送信すると、すべてが期待どおりに機能します。

私がやりたいのは、サーバーに接続することです。これが成功したら、1 つまたは複数のリクエストを送信します。handle_handshake の後にリクエストを送信しようとすると、handle_write ルーチンでエラー メッセージが表示されます - 初期化されていません。

すべての呼び出しは非同期なので、機能するパスは call connect handle_handshake と呼ばれます handle_handshake は、サーバーにメッセージを書き込むメソッドを呼び出します

私が行っている唯一の変更は、handle_handshake 内で「メッセージの送信」ルーチンを呼び出さないことです。

私のアプリはチャットの例と非常によく似ています(1つの例外があります-私のアプリは機能しません)

以下のコードを使用すると、すべてが機能します。

void handle_handshake(const boost::system::error_code& error)
{
 if (!error)
 {
  std::stringstream request_;

  request_ << "GET /api/0/data/ticker.php HTTP/1.1\r\n";
  request_ << "Host: mtgox.com\r\n";
  request_ << "Accept-Encoding: *\r\n";
  request_ << "\r\n";
  boost::asio::async_write(socket_,boost::asio::buffer(request_.str())
 ,boost::bind(&client::handle_write, this, boost::asio::placeholders::error,
  boost::asio::placeholders::bytes_transferred));
}
else
{
  std::cout << "Handshake failed: " << error.message() << "\n";
}
}
}

何か不足していますか?接続後、サーバーに複数のリクエストを送信できる必要があります。

4

1 に答える 1

1

何かが足りなかった。私が持っていた asyc_connect 呼び出し io_service.run. 次に、asyc_write を呼び出し、続いて io_service.run() を呼び出しました。最初の呼び出しの後に io_service.reset() を追加する必要がありました

ブースト ドキュメント io_service.reset

この関数は、run()、run_one()、poll()、または poll_one() 関数の 2 回目以降の一連の呼び出しの前に呼び出す必要があります。これは、io_service が停止しているか不足しているためにこれらの関数の呼び出しが返された場合です。仕事。この関数により、io_service は「停止」フラグなどの内部状態をリセットできます。

于 2013-01-10T14:31:30.167 に答える