snowflake id가 이상하게 생성되는 문제 해결결

This commit is contained in:
2025-05-04 14:50:52 +09:00
parent e0a371d536
commit 8ffe3a7519
3 changed files with 26 additions and 11 deletions

View File

@@ -53,6 +53,7 @@ public:
}
void processresponsePacket(ResponsePacket responsePacket, IOCPPASSINDATA* data);
void processLoginResponsePacket(LoginResponsePacket loginResponsePacket, IOCPPASSINDATA* data);
void processRoomCreateResponsePacket(RoomCreateResponsePacket roomCreateResponsePacket, IOCPPASSINDATA* data);
void processRoomListResponse(RoomListResponsePacket roomListResponsePacket, IOCPPASSINDATA* data);
void processRoomJoinResponsePacket(RoomJoinResponsePacket roomJoinResponsePacket, IOCPPASSINDATA* data);

View File

@@ -31,7 +31,13 @@ void ClientManager::_IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDA
PacketSet packetSet = packetParser(pack);
pack.convToN();
switch (packetSet) {
case PacketSet::LOGINRESPONSE:
case PacketSet::LOGINRESPONSE: {
LoginResponsePacket loginResponsePacket;
std::memcpy(&loginResponsePacket.serialized, &pack.serialized, 8 + packetLength);
loginResponsePacket.convToH();
processLoginResponsePacket(loginResponsePacket, data);
}
break;
case PacketSet::ROOMCREATERESPONSE:
case PacketSet::ROOMLISTRESPONSE:
case PacketSet::ROOMJOINRESPONSE:
@@ -152,6 +158,11 @@ void ClientManager::processresponsePacket(ResponsePacket responsePacket, IOCPPAS
// data->IOCPInstance->send(data, 1, 0);
}
void ClientManager::processLoginResponsePacket(LoginResponsePacket loginResponsePacket, IOCPPASSINDATA* data) {
::memcpy(&myID_.snowflake, loginResponsePacket.__data.yourId, sizeof(Snowflake));
}
void ClientManager::processRoomCreateResponsePacket(RoomCreateResponsePacket roomCreateResponsePacket, Chattr::IOCPPASSINDATA* data) {
// std::string roomName(
// (char*)roomCreateResponsePacket.__data.data,

View File

@@ -3,25 +3,28 @@
namespace Chattr {
Snowflake GenerateID() {
static struct _EPOCH {
_EPOCH() {
static struct EpochInitializer {
EpochInitializer() {
EPOCH = std::chrono::system_clock::now();
}
std::chrono::system_clock::time_point EPOCH;
} __EPOCH__;
} epochInitializer;
static std::mutex snowflakeGenerateMutex_;
std::lock_guard<std::mutex> lock(snowflakeGenerateMutex_);
#ifdef _WIN32
DWORD tid = GetCurrentThreadId();
#elif __linux__
pthread_t tid = pthread_self();
#endif
static int sequence = 0;
std::size_t tid;
#ifdef _WIN32
tid = static_cast<std::size_t>(GetCurrentThreadId());
#elif __linux__
tid = static_cast<std::size_t>(pthread_self());
#endif
thread_local static int sequence = 0;
Snowflake id = {};
auto timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - __EPOCH__.EPOCH);
auto timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - epochInitializer.EPOCH);
id.timestamp = timestamp.count();
id.instance = tid;
id.sequence = sequence++;