37 lines
1.3 KiB
C++
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);
|
|
}
|
|
}
|