私は、boost asio を使用した TCP ソケット クライアントの構築とテストの初期段階にいます。私が気付いたのは、ブーストソケットがサーバーに接続した場合、サーバーが接続されている間にサーバーをシャットダウンし (閉じた接続にブーストがどのように応答するかをテストするため)、async_write を使用してサーバーにメッセージを書き込むと、何も起こらないことです。まったく。非同期書き込みハンドラー メソッドは呼び出されません (エラーで呼び出されると思いました)。(ソケットが切断されない場合、非同期書き込みハンドラー メソッドは正しく呼び出されます。)
アップデート
非同期書き込みハンドラーが呼び出される前にタイムアウトになっているかどうかを確認するためにdeadline_timerを追加した後、書き込みハンドラーメソッドでエラーが発生しました。io_service のスレッドを使用する Deadline_timer を使用すると、ハンドラー メソッドにエラーが発生するようになりました。これはまだ説明できません…
コードは次のようになります。
comm_mgr(server_info& info, io_service& service): server_info_(info), io_service_(service), timer_(service)
{
DEBUG("comm_mgr.ctor()");
}
void start(void)
{
DEBUG("start(): starting connect() method call...");
connect();
DEBUG("start(): starting thread to run io_service::run()");
t_ = new boost::thread(boost::bind(&io_service::run, &io_service_));
timer_.async_wait(boost::bind(&comm_mgr::check_write_timeout, this));
}
void connect()
{
tcp::resolver resolver(io_service_);
tcp::resolver::query query(server_info_.host, server_info_.port);
tcp::resolver::iterator iterator = resolver.resolve(query);
INFO("connect(): resetting socket and calling async_connect with handle_connect callback. connecting to: " << server_info_.host << ":" << server_info_.port);
socket.reset(new tcp::socket(io_service_));
socket->async_connect(*iterator, boost::bind(&comm_mgr::handle_connect, this, boost::asio::placeholders::error, ++iterator));
}
void send(EZXMsg& msg)
{
const char* encoded = msg.api_msg(0);
size_t bytes = std::strlen(encoded);
timer_.expires_from_now(boost::posix_time::seconds(30));
boost::asio::async_write(*socket, boost::asio::buffer(encoded, bytes), boost::bind(&comm_mgr::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
void handle_write(const boost::system::error_code& error, std::size_t bytes_transferred)
{
if (!error)
{
LOG4CXX_DEBUG(logger, "handle_write(): sent bytes" << bytes_transferred);
} else {
LOG4CXX_ERROR(logger, "handle_write(): error. ex=" << error);
}
}
ソケットが閉じているときに書き込みを行うと、書き込みメソッドがエラーを記録しないのはなぜですか?