私は現在、(1)cinからのデータを受け取り、その入力をUNIXソケット経由で送信し、(2)UNIXソケットでデータを受け取り、そのデータを解析し、応答を返すために非同期IOを使用するサーバーを持っています。非同期io_machine内でブロックI/Oを使用できますか?
データを解析するとき、パーサーで発生するI/Oをブロックするにはどうすればよいですか(下の例のParseJSON(data_.data())
)?それはparsed
をasync_write
に返す前に、質問をし、それらの質問に対する回答をcin経由で収集する必要があります。現在、質問は印刷されていますが、答えがcinに入力される前に応答が送信されます。
socket_
は、stream_protocol::socket
からboost::asio
まで、FWIWである。
void handle_read(const boost::system::error_code& error,
size_t bytes_transferred)
{
if (!error)
{
string parsed = ParseJSON(data_.data());
async_write(socket_,
buffer(parsed),
boost::bind(&session::handle_write,
shared_from_this(),
placeholders::error));
}
}
void handle_write(const boost::system::error_code& error)
{
if (!error)
{
socket_.async_read_some(buffer(data_),
boost::bind(&session::handle_read,
shared_from_this(),
placeholders::error,
placeholders::bytes_transferred));
}
}
ParseJSONで何が起こるかの省略版(機密保持のための<に置き換えいくつかの文字列>):ことを意味し、それはブロックしますcin
から読み取るブロッキングを行い
string ParseJSON(string input)
{
int status;
string toWrite;
JSONNode parsed = libjson::parse(input);
JSONNode::const_iterator iter = parsed.begin();
json_string node_name = iter -> as_string();
if (node_name.compare("<>") == 0)
{
cout << "<>" << endl;
cout << "<>";
cout.flush();
cin >> status;
JSONNode n(JSON_NODE);
n.push_back(JSONNode("<>","<>"));
JSONNode c(JSON_NODE);
c.set_name("args");
c.push_back(JSONNode("<>",status));
n.push_back(c);
toWrite = n.write();
return toWrite;
}
}
'ParseJSON'コールで入出力を扱うコードを表示してください。たとえば' cin >> 'を使用している場合は、入力があるまで「ブロック」します。 – Nim