游戏服务器
qq_28710983
这个作者很懒,什么都没留下…
展开
-
关于libuv接收大于指定长度数据包
关于libuv接收大于指定长度数据包libuv接收数据:uv_alloc_buf分配多少大小内存空间,就接收多少大小的数据uv_read_start static void uv_connection(uv_stream_t* server, int status){ uv_session* uv_s = uv_session::create(); uv_tcp_t* ...原创 2018-10-14 11:49:51 · 2728 阅读 · 0 评论 -
session模块函数导出
在服务启动的时候把ctype注册到服务中static std::map<int, std::string> g_pb_cmd_map;std::map<int, std::string> cmd_map = { { 0, "LoginReq" }, { 1, "LoginRes" }};void proto_man::register_pb_cmd_ma...原创 2018-11-02 10:55:07 · 379 阅读 · 0 评论 -
C/C++ mysql模块导出函数供lua使用
因为lua是脚本语言,所以在处理IO和高密度计算的时候效率会低,通常就会把这类高计算函数用C/C++编写导出给lua使用,这里是使用tolua++来实现的tolua++需要引用的头文件#ifdef __cplusplusextern "C"{#endif#include "tolua++.h"#ifdef __cplusplus}#endif#include "tol...原创 2018-11-01 15:08:52 · 458 阅读 · 0 评论 -
lua_wrapper封装
lua_wrapper类class lua_wrapper{public: static void init(); //初始化lua虚拟机 static void exit(); //退出lua虚拟机 static bool exec_lua_file(const char* lua_file); static lua_State* lua_state(); //返回全...原创 2018-11-01 14:04:16 · 943 阅读 · 0 评论 -
Session管理
1、session抽象类是一个主要有4个接口,session实现着4个接口,就可以完成整个session管理功能class session {public: virtual void close() = 0; virtual void send_data(unsigned char* body, int len) = 0; virtual const char* get_addres...原创 2018-10-16 21:46:58 · 2531 阅读 · 0 评论 -
proto_man模块
proto_man模块主要用于编码解码用户数据体用户数据命令格式如下:2字节stype + 2字节ctype + 4字节utag + 数据bodybody可以是json字符串或者protobuf的Message对象1、cmd_msg结构体主要对整个数据封装成上面格式struct cmd_msg { int stype; //服务号 int ctype; //命...原创 2018-10-16 21:03:29 · 537 阅读 · 0 评论 -
libuv工作队列
主要通过uv_queue_work函数来实现工作队列,uv_work_t uv_work中的data可以用来传递数据static void thread_work(uv_work_t* req) { // printf("user data = %d \n", (int)req->data); printf("thread_work id 0x%d:\n", uv_thr...原创 2018-10-16 21:00:06 · 2051 阅读 · 0 评论 -
cache_alloc库实现
注意:主要使用c链表功能实现,链表主要是通过一个指针保存实际数据存放的位置,指针里面有指向下一个地址的一个指针,循环嵌套指向下一个地址,链表node其实和内存缓存区是两个部分。用node来把内存缓冲区做一个表链接起来使用而已1、cache_alloc是c库,c++调用需要extern “C”#ifdef __cplusplusextern "C" {#endif struct ca...原创 2018-10-15 20:50:05 · 404 阅读 · 0 评论 -
libuv实现timer时钟库
struct timer{ uv_timer_t uv_timer; //libuc timer handle void(*on_timer)(void* udata); void* udata; int repeat_count; //-1是一直循环};alloc_timer函数是初始化一个timer信息,通过uv_timer_init函数把timer加入到libuv事...原创 2018-10-15 20:39:38 · 1589 阅读 · 0 评论 -
WebSocket数据封包解包
websocket和TCP/IP多了一个握手协议(ws协议不用2字节长度加数据体的协议)1、ws_protocol类class ws_protocol{public: static bool ws_shake_hand(session* s, char* body, int len); static bool read_ws_header(unsigned char* recv_d...原创 2018-10-18 19:30:25 · 8242 阅读 · 0 评论 -
数据封包解包协议之TCP封包解包
数据封包协议规定:整个数据包包含2字节长度信息+数据包体。2字节长度信息包含本身着2字节。如:数据体是(abcdefg)7个字节,整体封包就是09abcdefg,总共是9个字节的协议1、netbus接收到数据后发送到static void on_recv_tcp_data(uv_session* s),数据包含在session管理里面s->recv_buf和s->recved两个属...原创 2018-10-15 10:59:13 · 13700 阅读 · 0 评论 -
NetBus网络总线
NetBus网络总线netbus类 class netbus {public: static netbus* instance();public: void init(); void start_tcp_server(int port); void start_ws_server(int port); void start_udp_server(int port); v...原创 2018-10-15 10:20:52 · 1819 阅读 · 0 评论 -
protobuf实战操作
lua调用C/C++函数发送数据主要操作函数是lua_table_to_protobuf,static google::protobuf::Message* lua_table_to_protobuf(lua_State* L, int stackIdx, const char* msg_name){ if (!lua_istable(L, stackIdx)){ return ...原创 2018-11-02 13:57:04 · 1604 阅读 · 0 评论