This commit is contained in:
bumpsoo 2026-02-03 09:44:08 +00:00
commit b887f15662
21 changed files with 1038 additions and 0 deletions

38
src/SessionManager.cpp Normal file
View file

@ -0,0 +1,38 @@
#include "SessionManager.h"
#include "Logger.h"
SessionManager &SessionManager::GetInstance() {
static SessionManager instance;
return instance;
}
void SessionManager::Join(std::shared_ptr<Session> session) {
std::lock_guard<std::mutex> lock(mutex_);
sessions_.insert(session);
Logger::Log("클라이언트[", session->GetNickname(),
"]가 입장했습니다. 총 세션 수: ", sessions_.size());
}
void SessionManager::Leave(std::shared_ptr<Session> session) {
std::lock_guard<std::mutex> lock(mutex_);
if (sessions_.erase(session) > 0) {
Logger::Log("클라이언트[", session->GetNickname(),
"]가 퇴장했습니다. 총 세션 수: ", sessions_.size());
}
}
void SessionManager::Broadcast(PacketHeader header,
std::span<const uint8_t> body) {
std::lock_guard<std::mutex> lock(mutex_);
// 패킷 직렬화 수행 (헤더 + 바디)
std::vector<uint8_t> buffer(sizeof(PacketHeader) + body.size());
std::memcpy(buffer.data(), &header, sizeof(PacketHeader));
std::memcpy(buffer.data() + sizeof(PacketHeader), body.data(), body.size());
for (auto &session : sessions_) {
// session::send에 span을 전달해야 함. 벡터 자체를 전달할 수도 있지만 우리
// Send는 span을 인자로 받음. Session::Send는 span을 받아 복사본을 생성함.
session->Send(buffer);
}
}