패킷 정의, 로그가 더 많이 설명하도록 변경
This commit is contained in:
@@ -10,6 +10,6 @@ int main() {
|
||||
Chattr::Address serveraddr(AF_INET, "localhost", 9011);
|
||||
|
||||
sock.connect(serveraddr);
|
||||
spdlog::info("Connection established from {}, {}", sock, (std::string)serveraddr);
|
||||
spdlog::info("Connection established from {}", (std::string)serveraddr);
|
||||
sock.send("Hello, World!", 14, 0);
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "Utils/Thread.hpp"
|
||||
#include "Utils/ThreadPool.hpp"
|
||||
#include "Utils/StringTokenizer.hpp"
|
||||
#include "Packet/Packet.hpp"
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
@@ -63,7 +64,7 @@ int main() {
|
||||
}
|
||||
|
||||
void _TCPClient(Chattr::TCPSocket sock, Chattr::Address addr) {
|
||||
spdlog::info("Connection accepted. [{}:{}]", sock, (std::string)addr);
|
||||
spdlog::info("Connection accepted. [{}]", (std::string)addr);
|
||||
|
||||
char buf[1024];
|
||||
|
||||
@@ -74,5 +75,5 @@ void _TCPClient(Chattr::TCPSocket sock, Chattr::Address addr) {
|
||||
std::string recvData(buf, redSize);
|
||||
spdlog::info("Red size : {}, {}", redSize, recvData);
|
||||
}
|
||||
spdlog::info("Client disconnected. [{}:{}]", sock, (std::string)addr);
|
||||
spdlog::info("Client disconnected. [{}]", (std::string)addr);
|
||||
}
|
||||
@@ -3,9 +3,11 @@
|
||||
namespace Chattr {
|
||||
|
||||
Session::Session() {
|
||||
init();
|
||||
}
|
||||
|
||||
Session::~Session() {
|
||||
destruct();
|
||||
}
|
||||
|
||||
bool Session::init() {
|
||||
|
||||
@@ -35,9 +35,11 @@ void Socket::destruct() {
|
||||
#endif
|
||||
}
|
||||
|
||||
Socket::operator SOCKET() const {
|
||||
if (valid_)
|
||||
Socket::operator SOCKET() {
|
||||
if (valid_) {
|
||||
valid_ = false;
|
||||
return sock_;
|
||||
}
|
||||
spdlog::critical("No valid socket created.");
|
||||
return INVALID_SOCKET;
|
||||
}
|
||||
|
||||
@@ -7,12 +7,14 @@ ThreadPool::ThreadPool(std::uint32_t numThreads) {
|
||||
int numCPU = numThreads;
|
||||
if (numThreads == 0) {
|
||||
#ifdef _WIN32
|
||||
SYSTEM_INFO sysinfo;
|
||||
GetSystemInfo(&sysinfo);
|
||||
numCPU = sysinfo.dwNumberOfProcessors;
|
||||
SYSTEM_INFO sysinfo;
|
||||
GetSystemInfo(&sysinfo);
|
||||
numCPU = sysinfo.dwNumberOfProcessors;
|
||||
#elif __linux__
|
||||
numCPU = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
numCPU = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
#endif
|
||||
spdlog::info("Auto-detected cpu count: {}", numCPU);
|
||||
spdlog::info("Setting ThreadPool Worker count to: {}", numCPU);
|
||||
}
|
||||
workers_.reserve(numCPU);
|
||||
|
||||
|
||||
191
include/Packet/Packet.hpp
Normal file
191
include/Packet/Packet.hpp
Normal file
@@ -0,0 +1,191 @@
|
||||
#pragma once
|
||||
#include "Utils/Snowflake.hpp"
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
namespace Chattr {
|
||||
|
||||
enum class PacketType : std::uint8_t {
|
||||
PACKET_POST,
|
||||
PACKET_REQUEST,
|
||||
PACKET_RESPONSE,
|
||||
PACKET_CONTINUE,
|
||||
};
|
||||
|
||||
enum class RequestType : std::uint8_t {
|
||||
LOGIN,
|
||||
ROOM_CREATE,
|
||||
ROOM_LIST,
|
||||
ROOM_JOIN,
|
||||
ROOM_EXIT,
|
||||
USERS_LIST,
|
||||
DATA
|
||||
};
|
||||
|
||||
enum class DataType : std::uint8_t {
|
||||
TEXT,
|
||||
BINARY
|
||||
};
|
||||
|
||||
class alignas(1) Packet {
|
||||
public:
|
||||
union {
|
||||
struct {
|
||||
PacketType packetType;
|
||||
RequestType requestType;
|
||||
DataType dataType;
|
||||
std::uint16_t packetLength;
|
||||
std::uint8_t data[1495];
|
||||
} __data;
|
||||
std::uint8_t serialized[1500];
|
||||
};
|
||||
std::uint8_t* convToN() {
|
||||
__data.packetLength = ::htons(__data.packetLength);
|
||||
return serialized;
|
||||
}
|
||||
std::uint8_t* convToH() {
|
||||
__data.packetLength = ::ntohs(__data.packetLength);
|
||||
return serialized;
|
||||
}
|
||||
};
|
||||
|
||||
class alignas(1) LoginRequestPacket : public Packet {
|
||||
public:
|
||||
union {
|
||||
struct {
|
||||
PacketType packetType;
|
||||
RequestType requestType;
|
||||
DataType dataType;
|
||||
std::uint16_t packetLength;
|
||||
std::uint8_t name[];
|
||||
} __data;
|
||||
std::uint8_t serialized[1500];
|
||||
};
|
||||
};
|
||||
|
||||
class alignas(1) RoomCreateRequestPacket : public Packet {
|
||||
public:
|
||||
union {
|
||||
struct {
|
||||
PacketType packetType;
|
||||
RequestType requestType;
|
||||
DataType dataType;
|
||||
std::uint16_t packetLength;
|
||||
std::uint8_t name[];
|
||||
} __data;
|
||||
std::uint8_t serialized[1500];
|
||||
};
|
||||
};
|
||||
|
||||
class alignas(1) RoomListRequestPacket : public Packet {
|
||||
public:
|
||||
union {
|
||||
struct {
|
||||
PacketType packetType;
|
||||
RequestType requestType;
|
||||
DataType dataType;
|
||||
std::uint16_t packetLength;
|
||||
std::uint32_t roomCount;
|
||||
std::uint8_t name[];
|
||||
} __data;
|
||||
std::uint8_t serialized[1500];
|
||||
};
|
||||
};
|
||||
|
||||
class alignas(1) RoomJoinRequestPacket : public Packet {
|
||||
public:
|
||||
union {
|
||||
struct {
|
||||
PacketType packetType;
|
||||
RequestType requestType;
|
||||
DataType dataType;
|
||||
std::uint16_t packetLength;
|
||||
std::uint8_t name[];
|
||||
} __data;
|
||||
std::uint8_t serialized[1500];
|
||||
};
|
||||
};
|
||||
|
||||
class alignas(1) RoomExitRequestPacket : public Packet {
|
||||
public:
|
||||
union {
|
||||
struct {
|
||||
PacketType packetType;
|
||||
RequestType requestType;
|
||||
DataType dataType;
|
||||
std::uint16_t packetLength;
|
||||
std::uint8_t data[];
|
||||
} __data;
|
||||
std::uint8_t serialized[1500];
|
||||
};
|
||||
};
|
||||
|
||||
class alignas(1) UsersListRequestPacket : public Packet {
|
||||
public:
|
||||
union {
|
||||
struct {
|
||||
PacketType packetType;
|
||||
RequestType requestType;
|
||||
DataType dataType;
|
||||
std::uint16_t packetLength;
|
||||
std::uint32_t usersCount;
|
||||
std::uint8_t name[];
|
||||
} __data;
|
||||
std::uint8_t serialized[1500];
|
||||
};
|
||||
};
|
||||
|
||||
class alignas(1) DataPostPacket : public Packet {
|
||||
public:
|
||||
union {
|
||||
struct {
|
||||
PacketType packetType;
|
||||
RequestType requestType;
|
||||
DataType dataType;
|
||||
std::uint16_t packetLength;
|
||||
std::uint8_t name[];
|
||||
} __data;
|
||||
std::uint8_t serialized[1500];
|
||||
};
|
||||
};
|
||||
|
||||
class alignas(1) ContinuePacket : public Packet {
|
||||
public:
|
||||
union {
|
||||
struct {
|
||||
std::uint16_t packetLength;
|
||||
std::uint8_t data[];
|
||||
} __data;
|
||||
std::uint8_t serialized[1500];
|
||||
};
|
||||
};
|
||||
|
||||
enum class ResponseStatusCode : std::uint16_t {
|
||||
OK = 200,
|
||||
CREATED = 201,
|
||||
ACCEPTED = 202,
|
||||
BAD_REQUEST = 400,
|
||||
FORBIDDEN = 403,
|
||||
NOT_FOUND = 404,
|
||||
LENGTH_REQUIRED = 411,
|
||||
IAM_A_TEAPOT = 418,
|
||||
TOO_MANY_REQUESTS = 429,
|
||||
INTERNAL_SERVER_ERROR = 500
|
||||
};
|
||||
|
||||
class alignas(1) ResponsePacket : public Packet {
|
||||
public:
|
||||
union {
|
||||
struct {
|
||||
PacketType packetType;
|
||||
RequestType requestType;
|
||||
DataType dataType;
|
||||
std::uint16_t packetLength;
|
||||
ResponseStatusCode responseStatusCode;
|
||||
std::uint8_t data[];
|
||||
} __data;
|
||||
std::uint8_t serialized[1500];
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
@@ -15,9 +15,11 @@ public:
|
||||
int send();
|
||||
int recv();
|
||||
|
||||
Session(const Session&) = delete;
|
||||
Session& operator=(Session&) = delete;
|
||||
|
||||
private:
|
||||
std::vector<Chattr::TCPSocket> tcpSock_;
|
||||
std::vector<Chattr::Socket> udpSock_;
|
||||
Chattr::TCPSocket sock_;
|
||||
struct Snowflake sessId_;
|
||||
};
|
||||
}
|
||||
10
include/Socket/IOCP.hpp
Normal file
10
include/Socket/IOCP.hpp
Normal file
@@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
namespace Chattr {
|
||||
class IOCP {
|
||||
public:
|
||||
IOCP();
|
||||
|
||||
~IOCP();
|
||||
};
|
||||
}
|
||||
@@ -14,7 +14,7 @@ public:
|
||||
void init(int domain, int type, int protocol);
|
||||
void destruct();
|
||||
|
||||
operator SOCKET() const;
|
||||
operator SOCKET();
|
||||
void set(const SOCKET);
|
||||
|
||||
void bind(sockaddr *__addr);
|
||||
|
||||
Reference in New Issue
Block a user