c++ - 可重载的 boost::asio::basic_stream_socket

标签 c++ templates boost-asio generic-programming

开发网络应用程序时,我有一个 Connection 类来管理在网络上发送和接收消息。我正在使用 boost::asio。

我现在想让 Connection 类处理通过 TCP 和本地 UNIX 流套接字的连接。然而,boost 的模板设计让我感到困惑。 AFAICT,local::stream_protocol::socket 和 ip::tcp::socket 之间没有共享基类。

我将如何创建一个封装网络语义的连接,以便其他代码不必处理所使用协议(protocol)的详细信息?

即我想实现类似的东西:

class Connection() {
  Connection(ip::tcp::endpoint& ep);
  Connection(local::stream_protocol::endpoint& ep);

  void send(Buffer& buf);
}

我如何实现这一目标?

最佳答案

经过一番思考,我目前的解决方案是将Connection的send和recv函数虚拟化,并创建Connection的模板子类,大致为:

template <typename Protocol>
class ConnectionImpl : public Connection {
    typedef typename Protocol::socket Socket;
    typedef typename Protocol::endpoint EndPoint;

    Socket _socket;
public:
    ConnectionImpl(boost::asio::io_service& ioSvc, const EndPoint& addr) 
        : Connection(ioSvc), _socket(ioSvc) { 
        _socket.connect(addr);
    }

    void trySend() {
        // Initiate async send on _socket here
    }

    void tryRead() {
        // Initiate async recv on _socket here
    }
}

有没有办法避免子类化和使用虚函数?

关于c++ - 可重载的 boost::asio::basic_stream_socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9443049/

相关文章:

c++ - 为什么我在试图找到 n 个元素的平均值时没有得到正确的值?

c++ - 如何使用 QtDbus 注册接口(interface)和注册方法?

c++ - 重用构造函数。将右值传递给 const 左值并且不重复执行

templates - Meteor 模板 Blaze 如何只返回数组的第一个元素

c++ - 使用 std::forward 进行参数包扩展的 '...' 的语法

c++ - 在 CentOS 上使用 OpenGL 支持从源代码编译 Qt 4.8.3

C++ 映射默认参数 typedef 要求

c++ - boost::asio 检查器

c++ - boost::asio::async_read 在不满足完成条件的情况下结束

c++ - `enable_shared_from_this` 有什么用处?