#pragma once #include "../Base/global_include.h" #include "core/main.h" #include "core/statistics.h" #include #include #include #include #include typedef struct KCPCB KCPCB; IUINT16 xcrc16 (void *buf, IUINT16 len); IUINT32 xcrc32 (void *buf, IUINT32 len); IUINT16 rand_range_16(IUINT16 min, IUINT16 max); int check_cycle_0_9(const char *str, int len); // 这是一个协议串联结构,把每一个结构可以灵活组合实现各种特性 // 串联的协议都是点对点的协议,从而实现协议的灵活组合 typedef struct Proto_Tree_Node Proto_Tree_Node; typedef struct Cache_List_Node Cache_List_Node; typedef struct Cache_List Cache_List; typedef struct Proto_Tree Proto_Tree; struct Base_CB { using Next_handle = std::function; Next_handle next_send{}; Next_handle next_recv{}; Cache_List_Node* pn{}; virtual void send(Buf_Type buf, Len_Type len, void* user) = 0; virtual void recv(Buf_Type buf, Len_Type len, void* user) = 0; virtual void print_state_info(){}; virtual ~Base_CB() = default; virtual void final_init(){}; virtual void update() {}; }; void test_proto_chain(); typedef IUINT32 (*Get_Millisecond)(); // tree 型协议 // typedef struct Speed_Statistics Speed_Statistics; // typedef struct Value_Statistics Value_Statistics; // typedef struct Probability_Statistics Probability_Statistics; typedef struct { Proto_Tree_Node *head, *tail; } Node_List; struct Proto_Tree_Node { using Handle = std::function; //using Handle = void(*)(Proto_Tree_Node* node, Buf_Type buf, Len_Type len); Base_CB* cb{}; // 结构数据 Proto_Tree_Node *prev{}, *next{}; Proto_Tree_Node* parent{}; Node_List children{}; Proto_Tree* tr{}; // 该节点 极其子节点组成整体协议的勾子函数 Handle pack_send{}; Handle pack_recv{}; Handle true_recv{}; Handle true_send{}; IUINT8 deep{}; // 可以存放统计信息节点 供测试节点打印 // const char* object_name; // 节点对象名称 explicit Proto_Tree_Node(Base_CB* cb); ~Proto_Tree_Node(); }; struct Cache_List_Node { Cache_List_Node *next, *prev; Proto_Tree_Node* tn; }; struct Cache_List { Cache_List_Node *head, *tail; }; struct Proto_Tree { //using Handle = void(*)(Proto_Tree* tr, Buf_Type buf, Len_Type len); using Handle = std::function; Cache_List cache_list{}; Node_List children{}; void* user{}; Handle pack_send{}; Handle pack_recv{}; Handle true_recv{}; Handle true_send{}; Proto_Tree(); ~Proto_Tree(); void send( Buf_Type buf, Len_Type len); void recv( Buf_Type buf, Len_Type len); void print_state_info(); void create(); Proto_Tree_Node* append(Proto_Tree_Node* par, Base_CB* cb); Proto_Tree_Node* prepend(Proto_Tree_Node* par, Base_CB* cb); }; // true pack // send 【真实数据】 顺着链表,不断增加 数据 【包头数据】 finial_send // recv 【包头数据】 顺着链表,不断减少 数据 【真实数据】 finial_recv void print_hex(const char* prefix, const uint8_t* data, int len, const char* suffix);