C++ 为类实现Boost::Asio的行为

C++ 为类实现Boost::Asio的行为,c++,asynchronous,boost-asio,C++,Asynchronous,Boost Asio,我正在编写一个OpenVPN3客户机,在这里,我不想在操作系统上打开一个tun设备,从而能够从文件描述符进行写和读,而是想直接与OpenVPN3接口。谢天谢地,OpenVPN3库使我能够传递与处理文件描述符不同的模板参数。因此,在代替asio::posix::basic_stream_descriptor的地方,我传递了模拟/实现与asio::posix::basic_stream_descriptor使用的相同函数的自定义类。因此,我需要在我的类中重新实现Boost Asio库的异步行为 我正

我正在编写一个OpenVPN3客户机,在这里,我不想在操作系统上打开一个tun设备,从而能够从文件描述符进行写和读,而是想直接与OpenVPN3接口。谢天谢地,OpenVPN3库使我能够传递与处理文件描述符不同的模板参数。因此,在代替
asio::posix::basic_stream_descriptor
的地方,我传递了模拟/实现与
asio::posix::basic_stream_descriptor
使用的相同函数的自定义类。因此,我需要在我的类中重新实现Boost Asio库的异步行为

我正在对OpenVPN3代码的一部分进行子类化,该部分在模板中使用
posix::basic_stream_descriptor
,如下所示:

template <typename ReadHandler>
class Tun : public TunIO<ReadHandler, PacketFrom, posix::basic_stream_descriptor>
前两个函数用于替换
posix::basic_stream_descriptor
,以便OpenVPN3可以使用,另外两个函数用于我的应用程序。以下是Asio功能的说明:

现在我需要一种方法来有效地排队所有4个呼叫,因为Asio意味着立即返回。所以我至少需要把他们排成FIFO。我想使用
std::deque
。因此,应该至少有2个
deque
s:一个用于队列
async\u read\u一些
调用,另一个用于
write\u一些
调用。我还没有决定是否希望我的应用程序异步调用AsioStyleDequeDescriptor,但我们假设它是这样做的。然后我需要另外两个
deque
s来执行
queue\u async\u read\u some
queue\u write\u some
调用

好的,现在我需要一个或多个线程将
async\u read\u some
queue\u async\u read\u some
write\u some
匹配。我认为,将
std::contidion\u变量
s放入
queue\u async\u read\u some
,激活
async\u read\u some
,就会出现一个线程。另一个线程监视何时将数据放入
write\u some
,该线程激活
queue\u write\u some


这个主意好吗?我在正确的轨道上,或者你能想出更好的方法吗?或者已经有什么东西可以满足我的要求了吗?

从实现细节开始,你应该首先解释“为什么”,最后你的目标是什么,背景。@JeanDavy我编辑了这个问题,现在应该更清楚了,我想你的意思是“实现Asio对象”。桥下有很多水,但我认为过去有一个例子。不确定它是否被移除
class AsioStyleDequeDescriptor {

    //called by OpenVPN3 to queue asynchronous reads with data from my app
    void async_read_some(
        const boost::asio::mutable_buffer &buffers,
        std::function(void(const boost::asio::error_code, const size_t)) handler);

    //called by OpenVPN3 to write data to be read by my app 
    std::size_t write_some(const boost::asio::const_buffer &buffers);

    //A way for my app to queue some data for OpenVPN3 async_read_some to read
    void queue_read_some(uint8_t* buffer, size_t size);

    //A way for my app to queue callbacks to be called when OpenVPN3 makes data available
    void queue_write_some(std::function<something...> callback);

};