58 lines
1.3 KiB
C++
58 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include "Packet.h"
|
|
#include <boost/asio.hpp>
|
|
#include <deque>
|
|
#include <memory>
|
|
#include <span>
|
|
|
|
using boost::asio::ip::tcp;
|
|
|
|
class Session : public std::enable_shared_from_this<Session> {
|
|
public:
|
|
Session(tcp::socket socket);
|
|
~Session();
|
|
|
|
void Start();
|
|
void Send(std::span<const uint8_t> data);
|
|
|
|
template <typename T> void SendPacket(PacketID id, const T &pkt) {
|
|
uint16_t size = static_cast<uint16_t>(pkt.ByteSizeLong());
|
|
PacketHeader header;
|
|
header.id = static_cast<uint16_t>(id);
|
|
header.size = size;
|
|
|
|
std::vector<uint8_t> buffer(sizeof(PacketHeader) + size);
|
|
std::memcpy(buffer.data(), &header, sizeof(PacketHeader));
|
|
pkt.SerializeToArray(buffer.data() + sizeof(PacketHeader), size);
|
|
|
|
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<uint8_t> packetBody_;
|
|
|
|
// 스레드 안전성과 순서 보장을 위한 출력 패킷 큐
|
|
std::deque<std::vector<uint8_t>> writeQueue_;
|
|
|
|
std::string nickname_;
|
|
uint64_t gold_ = 0;
|
|
uint32_t swordLevel_ = 0;
|
|
};
|