如何解决连续两次出现async_write问题
当我两次调用async_write时,第二条消息没有发送到服务器。在写处理程序中,我调用async_read,当我运行代码时,程序停留在读取状态。 在连接处理程序中:
clientSocketPtr->lowest_layer().set_option(BA::ip::tcp::no_delay(true));
clientSocketPtr->set_verify_mode(BA::ssl::verify_peer);
clientSocketPtr->set_verify_callback(BA::ssl::host_name_verification(ADDRESS));
clientSocketPtr->handshake(ssl_socket::client);
//first call with first message(76 bytes)
BA::post(io_context,boost::bind(&ssd::write_msg,message,clientSocketPtr));
//some code here
//second call with another message(160 bytes)
BA::post(io_context,clientSocketPtr));
在write_msg中:
void ssd::write_msg(ssd::Message &msg,ssd::ssl_socket *clientSocketPtr) {
//some code here
BA::async_write(*clientSocketPtr,BA::buffer(buf,bufSize),BA::transfer_exactly(bufSize),boost::bind(&ssd::write_handler,BA::placeholders::error,BA::placeholders::bytes_transferred,clientSocketPtr));
io_context.run();
}
在写处理程序中,我叫:
BA::post(io_context,boost::bind(&ssd::read_msg,clientSocketPtr));
在read_msg中,我称为async_read。
输出为文本:
I20200818 11:17:38.633821 7417 message.hpp:53]
Message type: 1
Message length: 70
Message: {"cli_type":"tarball","cli_version":"v2020.07.18","cmd":"cli_version"}
I20200818 11:17:38.637073 7417 sslconnection.cpp:77] Bytes sent: 76
I20200818 11:17:38.637115 7417 sslconnection.cpp:77] Bytes sent: 160
I20200818 11:17:38.640669 7417 sslconnection.cpp:109] Bytes recieved: 6
I20200818 11:17:38.640744 7417 sslconnection.cpp:122] Bytes recieved: 47
I20200818 11:17:38.640764 7417 sslconnection.cpp:128]
Message length: 47
Message: {"cmd":"be_version","be_version":"v2020.07.15"}
解决方法
一次只能有一个async_write
未付。请注意,async_write
是根据async_write_some
实现的,两次写入可以交错。
我已经做了一些研究,并使用绞线和建立消息队列解决了我的问题。首先,将消息推送到队列,然后调用将检查队列是否为空的函数很重要。如果不是,则代码将处理该消息并调用async_write
,此后立即从消息队列中弹出此消息。在写处理程序代码中调用async_read
,此后立即检查队列是否再次为空。如果不是,它将调用写入功能。
一些伪代码:
msg_queue.push("First");
msg_queue.push("Second");
writeMsg();
writeMsg() {
if (!msg_queue.empty()) {
//proccess the message
async_write(message);
msg_queue.pop();
}
}
write_handler() {
if(!error) {
readMsg();
if (!msg_queue.empty())
write_msg()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。