#pragma once #include "Packet.h" #include #include #include #include using boost::asio::ip::tcp; class Session : public std::enable_shared_from_this { public: Session(tcp::socket socket); ~Session(); void Start(); void Send(std::span data); template void SendPacket(PacketID id, const T &payload) { PacketHeader header; header.id = static_cast(id); header.size = sizeof(T); std::vector buffer(sizeof(PacketHeader) + sizeof(T)); std::memcpy(buffer.data(), &header, sizeof(PacketHeader)); std::memcpy(buffer.data() + sizeof(PacketHeader), &payload, sizeof(T)); Send(buffer); } void SendPacket(PacketID id); void SetNickname(const std::string &nickname); const std::string &GetNickname() const; void SetGold(uint64_t gold); uint64_t GetGold() const; void SetSwordLevel(uint32_t level); uint32_t GetSwordLevel() const; private: void DoReadHeader(); void DoReadBody(); void DoWrite(); tcp::socket socket_; PacketHeader packetHeader_; std::vector packetBody_; // 스레드 안전성과 순서 보장을 위한 출력 패킷 큐 std::deque> writeQueue_; std::string nickname_; uint64_t gold_ = 0; uint32_t swordLevel_ = 0; };