2012-08-14 179 views
1

我正在使用boost asio开发一个tcp服务器进程,它侦听客户端连接。客户端需要发送部分数据包。服务器进程无法处理数据包,直到它从客户端收到整个数据包(标头,数据和页脚)。如何检索升压asio套接字文件描述符

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

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

的std ::地图< INT,的std :: deque的<的std :: string>

如果检索套接字文件描述符是不可行的,这可能是为了获得最佳性能的替代品。我需要使用

std :: map < tcp :: socket *,std :: deque < std :: string >>>?

在此先感谢。

回答

1

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

像这样:

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 
+0

谢谢大卫。通过在与每个客户端连接关联的对象中维护队列,我对设计做了一些修改。 – Rak 2012-08-15 17:24:10

12

有由Socket类继承了basic_socket::native_handle()成员函数,但你真的应该考虑@大卫的回答。

+4

感谢您回答问题,而不是说“不要那样做”。仅仅因为OP给出的需要能力的特殊理由不是必要的,并不意味着他要求的信息是没有用的。 [仅供参考:我在包含日志消息中的句柄#中证明它有助于诊断问题。] – 2013-07-10 15:26:01

相关问题