sword_game/server/SessionManager.cpp
2026-02-04 14:01:55 +00:00

37 lines
1.3 KiB
C++

#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);
}
}