V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
linghutf
V2EX  ›  C

关于 Boost.Asio 关闭 socket 的方式

  •  
  •   linghutf · 2016-06-12 19:20:46 +08:00 · 1571 次点击
    这是一个创建于 3077 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 之前在不再读写的时候会使用这样的回调
    void handle_close(const boost::system::error_code& ec)
            {
                if(!ec){
                    LOG4CPLUS_DEBUG(LOG,LOG4CPLUS_TEXT("close connection..."));
                    
                    socket_.shutdown(boost::asio::socket_base::shutdown_send);
                    
                    boost::asio::async_read(socket_,boost::asio::null_buffers(),
                            boost::bind(&Connection::handle_close,
                                shared_from_this(),
                                boost::asio::placeholders::error));
    
                }else if(ec == boost::asio::error::eof){
                    socket_.shutdown(boost::asio::socket_base::shutdown_receive);
                    socket_.close();
                    LOG4CPLUS_DEBUG(LOG,LOG4CPLUS_TEXT("connection closed."));
                }else{
                    LOG4CPLUS_ERROR(LOG,LOG4CPLUS_TEXT("error:"<<ec.message()));
                }
            }
    
    
    • 后来 stackoverflow 上建议这样
     socket_.shutdown(boost::asio::socket_base::shutdown_both);
     socket_.close();
    
    • 之后又有说只要这个对象是 shared_ptr 管理的,就不需要 close,在 conn 对象析构的时候就会 close
    • 因此想请教一下正确的关闭方式
    1 条回复    2016-06-13 09:29:49 +08:00
    jeffersonpig
        1
    jeffersonpig  
       2016-06-13 09:29:49 +08:00
    一看到 boost 这老长老长的嵌套 namespace 就莫名的火大
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5787 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 03:26 · PVG 11:26 · LAX 19:26 · JFK 22:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.