【问题标题】:How to retrieve boost asio socket file descriptor如何检索boost asio套接字文件描述符
【发布时间】:2012-08-11 06:41:43
【问题描述】:

我正在使用 boost asio 开发一个侦听客户端连接的 tcp 服务器进程。客户端应该发送部分数据包。服务器进程在从客户端收到整个数据包(头、数据和页脚)之前,无法处理数据包。

为了处理部分数据包,服务器进程需要将来自每个客户端连接的数据包(或部分数据包)推送到队列中。服务器将为每个客户端连接维护一个队列。

现在我的问题是如何在使用 boost asio 时获取套接字文件描述符。我打算使用套接字文件描述符中的整数值并创建一个 std::map 容器来处理每个客户端连接的队列。

std::map

如果检索套接字文件描述符不可行,那么可以采取哪些替代方案来获得最佳性能。我需要使用

std::map<:socket> > ?

提前致谢。

【问题讨论】:

    标签: sockets boost


    【解决方案1】:

    套接字类继承了basic_socket::native_handle() 成员函数,但你真的应该考虑@David 的答案。

    【讨论】:

    • 感谢您实际回答问题,而不是说“不要那样做”仅仅因为 OP 给出的不需要该功能的特定理由并不意味着他要求的信息因为永远没有用。 [仅供参考:我将句柄 # 包含在日志消息中,事实证明它对诊断问题很有用。]
    • 有时您需要套接字文件描述符,例如,如果它在您想要重用的另一个代码库中使用。底层类型为 asio::detail::socket_type fd = socket.native_handle();
    【解决方案2】:

    当您调用各种接收函数时,将指针(或共享指针)传递给与该连接关联的结构。不需要来自套接字描述符的映射,因为您永远不需要触摸套接字描述符。

    像这样:

    boost::asio::async_read(socket, boost::asio::buffer(buf),
        boost::bind(&MyConnection::doRead, this, boost::asio::placeholders::error));
    
    
    void MyConnection::doRead(const boost::system::error_code& error)
    {
     // Here, we are in the object associated with this connection
    

    【讨论】:

    • 谢谢大卫。我通过在与每个客户端连接关联的对象中维护队列来对我的设计进行了一些修改。
    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2012-11-02
    相关资源
    最近更新 更多