#include "SessionManager.h" #include "Logger.h" SessionManager &SessionManager::GetInstance() { static SessionManager instance; return instance; } void SessionManager::Join(std::shared_ptr session) { std::lock_guard lock(mutex_); sessions_.insert(session); Logger::Log("클라이언트[", session->GetNickname(), "]가 입장했습니다. 총 세션 수: ", sessions_.size()); } void SessionManager::Leave(std::shared_ptr session) { std::lock_guard lock(mutex_); if (sessions_.erase(session) > 0) { Logger::Log("클라이언트[", session->GetNickname(), "]가 퇴장했습니다. 총 세션 수: ", sessions_.size()); } } bool SessionManager::TryJoin(std::shared_ptr session, const std::string &nickname) { std::lock_guard lock(mutex_); // 중복 체크 for (const auto &existing : sessions_) { if (existing->GetNickname() == nickname) { Logger::Log("이미 접속 중인 유저 로그인 시도: ", nickname); return false; } } // 중복이 없으면 닉네임 설정 후 추가 session->SetNickname(nickname); sessions_.insert(session); Logger::Log("클라이언트[", nickname, "]가 입장했습니다. 총 세션 수: ", sessions_.size()); return true; } void SessionManager::Broadcast(PacketHeader header, std::span body) { std::lock_guard lock(mutex_); std::vector 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); } }