Blob Blame Raw
#ifndef SOCKET_H
#define SOCKET_H


#include <thread>
#include <atomic>

#include "protocol.h"


class TcpProtocol;


class TcpSocket: public Socket {
public:
	const int sockId;
protected:
	friend class TcpProtocol;
	
	TcpSocket(
		Protocol &protocol,
		const Connection::Handle &connection,
		const Server::Handle &server,
		const Address &address,
		int sockId );
	
	TcpProtocol& getProtocol()
		{ return *(TcpProtocol*)&protocol; }
};


class TcpProtocol: public Protocol {
private:
	friend class TcpSocket;
	
	std::thread *thread;
	bool stopping;
	int epollId;
	
	void threadRun();
	
public:
	TcpProtocol();
	
	ErrorCode resolve(Address &address) override;
	ErrorCode connect(const Connection::Handle &connection, const Address &address) override;
	ErrorCode listen(const Server::Handle &server, const Address &address) override;
	void start();
	void stop();
};


#endif