ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • c++에서의 패킷 핸들러 바인딩
    프로그래밍/코드 조각 2018. 10. 21. 23:43
    반응형


    #include <cstdint>
    #include <map>
    #include <functional>

    using namespace std;

    namespace packet
    {
    enum class Type : unsigned short
    {
    None = 0,
    Login = 1,
    Logout = 2,
    };

    struct Header
    {
    std::uint16_t size;
    Type type;
    };

    struct Login
    {
    char id[20];
    std::uint8_t len;
    };
    }

    std::map<packet::Type, std::function<void(int, void*)>> handlers;

    template < typename PayloadType >
    void bind(packet::Type type, void(*handler)(int, const PayloadType&))
    {
    handlers[type] = [handler](int networkId, void* packet)
    {
    const PayloadType& payload = *static_cast<PayloadType*>(packet);
    handler(networkId, payload);
    };
    }

    void handle_login(int networkId, const packet::Login& login)
    {
    }

    int main()
    {
    bind(packet::Type::Login, handle_login);

      return 0;
    }


    조금 응용하면 깔끔한 핸들러를 만들 수 있다. 

    프로토콜 버퍼를 쓰면서 해당 방식과 비슷하게 쓰는데  편하다. 여러가지 체크 코드를 끼워서 넣기도 하고. 


    ++ 2019/08/01 클래스 멤버 함수 버전


    #include <cstdint>
    #include <map>
    #include <functional>

    namespace packet
    {
    enum class Type : unsigned short
    {
    None = 0,
    Login = 1,
    Logout = 2,
    };

    struct Header
    {
    std::uint16_t size;
    Type type;
    };

    struct Login
    {
    char id[20];
    std::uint8_t len;
    };
    }

    class message_handler
    {
    public:

    message_handler()
    {
    bind(packet::Type::Login, &message_handler::handle_login);
    }

    template < typename PacketType >
    void bind(packet::Type packetType, void(message_handler::*handler)(const PacketType&))
    {
    handlers[packetType] = [this, handler](const void* ptr)
    {
    const PacketType& packet = *((const PacketType*)ptr);
    ((*this).*handler)(packet);
    };
    }

    void handle_login(const packet::Login& packet)
    {
    }

    private:

    std::map<packet::Type, std::function<void(const void*)>> handlers;
    };

    int main()
    {
    message_handler handler;

    return 0;
    }


    반응형
Designed by Tistory.