Boost官网的socket::close()函数,见description
“此函数会导致所有未完成的异步连接、发送和接收操作立即完成,并且取消操作的处理程序将传递 boost::asio::error::operation_aborted 错误。”
但奇怪的是,当我调用 chat_session::close() 时,socket::close() 传递的是 ERROR_CONNECTION_ABORTED (1236) 错误,而不是 boost::asio::error::operation_aborted (995)。
为什么会这样? 这是我的 chat_session 类。
class chat_session
: public boost::enable_shared_from_this<chat_session>
{
public:
chat_session(boost::asio::io_service& io, chat_server* room)
: m_sock(io), m_room(room)
{
}
~chat_session()
{
}
void start()
{
m_room.join(shared_from_this());
m_sock.async_read_some(
boost::asio::buffer(m_recv_data),
boost::bind(&chat_session::handle_read, shared_from_this(),
boost::asio::placeholders::error));
}
void close()
{
// closing socket. chat_session::handle_read will receive
// boost::asio::error::operation_aborted error.
m_sock.close();
}
boost::asio::ip::tcp::socket& socket()
{
return m_sock;
}
private:
void handle_read(const boost::system::error_code& error)
{
if (!error)
{
printf("RECV -> %s.\n", m_recv_data);
m_sock.async_read_some(
boost::asio::buffer(m_recv_data),
boost::bind(&chat_session::handle_read, shared_from_this(),
boost::asio::placeholders::error));
}
else
{
// when i call chat_session::close(),
// ERROR_CONNECTION_ABORTED (1236) error occurred
// instead of boost::asio::error::operation_aborted error over here
...
m_room.leave(shared_from_this());
}
}
boost::asio::ip::tcp::socket m_sock;
chat_room& m_room;
char m_recv_data[50];
};
最佳答案
在关闭套接字之前先尝试调用 shutdown,正如 boost basic_stream_socket::close 文档在备注 here 中指定的那样:
Remarks
For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.
在您的关闭函数中尝试类似以下内容:
m_sock.shutdown(boost::asio::ip::tcp::socket::shutdown_receive);
m_sock.close();
如果要关闭发送和接收,请使用“shutdown_both”而不是“shutdown_receive”。
有趣的是,我已经看到这个错误发生在 Windows 而不是 Linux 上,当使用一个没有调用关闭的实现时。
关于c++ - Boost.Asio socket::close 不抛出 boost::asio::error::operation_aborted 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33087947/