#ifndef SOCKET_H
#define SOCKET_H
#include <thread>
#include <atomic>
#include "protocol.h"
enum : ErrorCode {
ERR_TCP_COMMON = ERR_TCP,
ERR_TCP_WORKER_FAILED,
};
class TcpProtocol;
class TcpSocket final: 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::mutex mutexIdle;
std::mutex mutexRun;
std::atomic<bool> wantRun;
std::thread *thread;
int epollId;
int eventsId;
void controlCommand(unsigned long long cmd);
void threadConnectionWrite(TcpSocket *socket, const Connection::Handle &connection);
void threadConnectionRead(TcpSocket *socket, const Connection::Handle &connection);
void threadProcessEvents(void *eventsPtr, int count);
void threadRun();
public:
TcpProtocol();
~TcpProtocol();
ErrorCode resolve(Address &address) override;
protected:
ErrorCode onStart() override;
void onStop(ErrorCode) override;
void onSocketChanged(Socket *socket) override;
ErrorCode onConnect(const Connection::Handle &connection, const Address &address) override;
ErrorCode onListen(const Server::Handle &server, const Address &address) override;
};
#endif