开发网络应用程序时,我有一个 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/