# kcp **Repository Path**: gavingqf/kcp ## Basic Information - **Project Name**: kcp - **Description**: 基于asio的高效kcp封装。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2023-01-31 - **Last Updated**: 2024-08-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: kcp, udp ## README # summary kcp module is a reliable udp with kcp-c and boost.asio library. # note please see test_kcp.h to how to see this module. ```c++ #pragma once /* * kcp server test. */ #include "knet.h" // #include "log.h" #ifndef Debug #define Debug printf #endif class KSession : public KCP::IKSession { public: KSession() : m_con(nullptr) {} virtual ~KSession() = default; // set connection virtual void GNAPI setConnection(KCP::IKConnection *conn) { m_con = conn; } // recv data callback. virtual bool GNAPI onRecv(const char *data, int len) { Debug("receive %s", std::string(data, len).c_str()); m_con->SendMsg(data, len); return true; } // connection close callback virtual void GNAPI onClose() { Debug("%p close!", this); } // connection establish callback virtual void GNAPI onEstablish() { m_con->SendMsg("hello", 5); } // release session. virtual void GNAPI release() { delete this; } private: KCP::IKConnection *m_con; }; class KSessionFactory : public KCP::IKSessionFactory { public: KSessionFactory() = default; ~KSessionFactory() = default; virtual KCP::IKSession* GNAPI CreateSession() { return new KSession(); } }; class KSession_Client : public KCP::IKSession { public: KSession_Client() : m_con(nullptr) {} ~KSession_Client() = default; // set connection virtual void GNAPI setConnection(KCP::IKConnection *conn) { m_con = conn; } // recv data callback. virtual bool GNAPI onRecv(const char *data, int len) { Debug("receive %s", std::string(data, len).c_str()); m_con->SendMsg(data, len); return true; } // connection close callback virtual void GNAPI onClose() { Debug("%p close!", this); } // connection establish callback virtual void GNAPI onEstablish() { Debug("%p establish, id: %d!\n", this, m_con->GetConv()); m_con->SendMsg("world", 5); } // release session. virtual void GNAPI release() { delete this; } private: KCP::IKConnection *m_con; }; class KClientSessionFactory : public KCP::IKSessionFactory { public: KClientSessionFactory() {} virtual ~KClientSessionFactory() {} virtual KCP::IKSession* GNAPI CreateSession() { return new KSession_Client(); } }; inline bool Start(const char *ip, unsigned short port) { KCP::IKcpModule *kcpModule = KCP::GetKcpModule(); kcpModule->Init(); return kcpModule->Listen(ip, port, new KSessionFactory); } inline bool Connect(const char *ip, unsigned short port) { KCP::IKcpModule *kcpModule = KCP::GetKcpModule(); kcpModule->Init(); return kcpModule->Connect(ip, port, new KClientSessionFactory); } inline void KCPRun(int count=-1) { KCP::IKcpModule *kcpModule = KCP::GetKcpModule(); kcpModule->Run(count); } // server void main() { Start("0", 12345) for (;;) { KCPRun(1000) // sleep } } // client /* void main() { Connect("127.0.0.1", 12345) for (;;) { KCPRun(1000) // sleep } } */ ```