Files
CppNet/cppnet/socket/rw_socket.h
2021-06-07 12:41:43 +08:00

78 lines
2.4 KiB
C++

// Use of this source code is governed by a BSD 3-Clause License
// that can be found in the LICENSE file.
// Author: caozhiyi (caozhiyi5@gmail.com)
#ifndef CPPNET_SOCKET_READ_WRITE_SOCKET
#define CPPNET_SOCKET_READ_WRITE_SOCKET
#include <atomic>
#include "socket_interface.h"
#include "include/cppnet_socket.h"
namespace cppnet {
class Event;
class BufferQueue;
class AlloterWrap;
class BlockMemoryPool;
class RWSocket:
public Socket,
public CNSocket,
public std::enable_shared_from_this<RWSocket> {
public:
RWSocket();
RWSocket(std::shared_ptr<AlloterWrap> alloter);
RWSocket(uint64_t sock, std::shared_ptr<AlloterWrap> alloter);
virtual ~RWSocket();
virtual uint64_t GetSocket() { return _sock; }
virtual void SetListenPort(uint16_t port) { _listen_port = port; }
virtual uint16_t GetListenPort() { return _listen_port; }
virtual bool GetAddress(std::string& ip, uint16_t& port);
virtual void Close();
virtual void Read() {}
virtual bool Write(const char* src, uint32_t len) { return false; }
virtual void Connect(const std::string& ip, uint16_t port) {}
virtual void Disconnect() {}
virtual void AddTimer(uint32_t interval, bool always = false);
virtual void StopTimer();
virtual void OnTimer();
virtual void OnRead(Event* event, uint32_t len = 0) {}
virtual void OnWrite(Event* event, uint32_t len = 0) {}
virtual void OnConnect(Event* event, uint16_t err);
virtual void OnDisConnect(Event* event, uint16_t err) {}
virtual void SetContext(void* context) { _context = context; }
virtual void* GetContext() { return _context; }
virtual void SetShutdown() { _shutdown = true; }
virtual bool IsShutdown() { return _shutdown; }
virtual std::shared_ptr<BufferQueue> GetReadBuffer() { return nullptr; }
std::shared_ptr<AlloterWrap> GetAlloter() { return _alloter; }
protected:
void* _context;
uint32_t _timer_id;
uint16_t _listen_port;
std::atomic_bool _shutdown;
std::shared_ptr<AlloterWrap> _alloter;
std::shared_ptr<BlockMemoryPool> _block_pool;
};
std::shared_ptr<RWSocket> MakeRWSocket();
std::shared_ptr<RWSocket> MakeRWSocket(std::shared_ptr<AlloterWrap> alloter);
std::shared_ptr<RWSocket> MakeRWSocket(uint64_t sock, std::shared_ptr<AlloterWrap> alloter);
}
#endif