write some mode code...
#ifndef NETWORK_TCP_HH
#define NETWORK_TCP_HH
#include "NetworkSocket.hh"
#include "NetworkAddress.hh"
const size_t NETWORK_TCP_CHUNK_SIZE = 1024;
const size_t NETWORK_TCP_INITIAL_IN_BUF = 4096;
const size_t NETWORK_TCP_INITIAL_OUT_BUF = 0;
class NetworkDisconnectError : public exception {
};
class NetworkBuffer {
private:
char *buf;
size_t size, off;
NetworkSocket &socket;
public:
NetworkBuffer (NetworkSocket &socket, size_t size_hint);
private:
NetworkBuffer (const NetworkBuffer ©) { };
~NetworkBuffer (void);
NetworkBuffer& operator= (const NetworkBuffer ©) { };
void resize (size_t suffix_size);
void trim (size_t prefix_size);
public:
void push_write (char *buf_ptr, size_t buf_size);
void flush_write (void);
template <typename PrefixType> void write_prefix (char *buf, PrefixType prefix);
void try_read (size_t item_size);
bool peek_prefix (uint16_t &ref);
bool peek_prefix (uint32_t &ref);
template <typename PrefixType> PrefixType read_prefix (char *buf_ptr, size_t buf_max);
};
class NetworkTCPTransport {
private:
NetworkSocket socket;
NetworkBuffer in, out;
protected:
CL_SlotContainer slots;
public:
NetworkTCPTransport (CL_Socket socket);
private:
void on_read (void);
void on_write (void);
void on_disconnected (void);
public:
void write_packet (const NetworkPacket &packet);
CL_Signal_v1<const NetworkPacket&> sig_packet;
CL_Signal_v0 sig_disconnect;
};
class NetworkTCPServer {
private:
NetworkSocket socket;
public:
NetworkTCPServer (const NetworkAddress &listen_addr);
private:
void on_accept (void);
public:
CL_Signal_v1<NetworkTCPTransport *> sig_client;
};
class NetworkTCPClient : public NetworkTCPTransport {
public:
NetworkTCPClient (const NetworkAddress &connect_addr);
};
#endif /* NETWORK_TCP_HH */