📄 socketpool.h
字号:
#ifndef UTILS_BASE_SOCKETPOOL_H_#define UTILS_BASE_SOCKETPOOL_H_#include <deque>#include <vector>#include "logging.h"#include "sigslot.h"namespace utils_base {class AsyncSocket;class LoggingAdapter;class SocketAddress;class SocketFactory;class SocketStream;class StreamInterface;//////////////////////////////////////////////////////////////////////// StreamPool//////////////////////////////////////////////////////////////////////class StreamPool {public: virtual ~StreamPool() { } virtual StreamInterface* RequestConnectedStream(const SocketAddress& remote, int* err) = 0; virtual void ReturnConnectedStream(StreamInterface* stream) = 0;};///////////////////////////////////////////////////////////////////////////////// StreamCache - Caches a set of open streams, defers creation/destruction to// the supplied StreamPool.///////////////////////////////////////////////////////////////////////////////class StreamCache : public StreamPool, public sigslot::has_slots<> {public: StreamCache(StreamPool* pool); virtual ~StreamCache(); // StreamPool Interface virtual StreamInterface* RequestConnectedStream(const SocketAddress& remote, int* err); virtual void ReturnConnectedStream(StreamInterface* stream);private: typedef std::pair<SocketAddress, StreamInterface*> ConnectedStream; typedef std::list<ConnectedStream> ConnectedList; void OnStreamEvent(StreamInterface* stream, int events, int err); // We delegate stream creation and deletion to this pool. StreamPool* pool_; // Streams that are in use (returned from RequestConnectedStream). ConnectedList active_; // Streams which were returned to us, but are still open. ConnectedList cached_;};//////////////////////////////////////////////////////////////////////// NewSocketPool /////////////////////// Creates a new PTcpSocket every time//////////////////////////////////////////////////////////////////////class NewSocketPool : public StreamPool {public: NewSocketPool(SocketFactory* factory); virtual ~NewSocketPool(); // StreamPool Interface virtual StreamInterface* RequestConnectedStream(const SocketAddress& remote, int* err); virtual void ReturnConnectedStream(StreamInterface* stream); private: SocketFactory* factory_; std::vector<StreamInterface*> used_;};//////////////////////////////////////////////////////////////////////// ReuseSocketPool ///////////////////////// Pass a PTcpSocket chain to the constructor, and if the connection// is still open, it will be reused.//////////////////////////////////////////////////////////////////////class ReuseSocketPool : public StreamPool {public: ReuseSocketPool(SocketFactory* factory, AsyncSocket* socket = 0); virtual ~ReuseSocketPool(); void setSocket(AsyncSocket* socket); // StreamPool Interface virtual StreamInterface* RequestConnectedStream(const SocketAddress& remote, int* err); virtual void ReturnConnectedStream(StreamInterface* stream); private: SocketFactory* factory_; SocketStream* stream_;};///////////////////////////////////////////////////////////////////////////////// LoggingPoolAdapter - Adapts a StreamPool to supply streams with attached// LoggingAdapters.///////////////////////////////////////////////////////////////////////////////class LoggingPoolAdapter : public StreamPool {public: LoggingPoolAdapter(StreamPool* pool, LoggingSeverity level, const std::string& label, bool binary_mode); virtual ~LoggingPoolAdapter(); // StreamPool Interface virtual StreamInterface* RequestConnectedStream(const SocketAddress& remote, int* err); virtual void ReturnConnectedStream(StreamInterface* stream);private: StreamPool* pool_; LoggingSeverity level_; std::string label_; bool binary_mode_; typedef std::deque<LoggingAdapter*> StreamList; StreamList recycle_bin_;};//////////////////////////////////////////////////////////////////////} // namespace utils_base#endif // UTILS_BASE_SOCKETPOOL_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -