У меня есть сервер, который в настоящее время использует асинхронный ввод-вывод, чтобы (1) принимать данные из cin и отправлять эти данные через сокет UNIX и (2) принимать данные из сокета UNIX, анализировать эти данные и отправлять ответ. 1001 *
Когда я анализирую данные, как я могу заблокировать ввод / вывод, который происходит в синтаксическом анализаторе (ParseJSON(data_.data())
в примере ниже)? Он должен задавать вопросы и собирать ответы на эти вопросы через cin, прежде чем возвращать parsed
для async_write
; в настоящее время вопросы печатаются, но ответ отправляется до того, как ответы введены в 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 (некоторые строки заменены на <> для конфиденциальности):
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;
}
}