struct中使用char[]

缘由

最近在看redis的源码,刚开始看sds,看到这块代码

struct __attribute__ ((__packed__)) sdshdr5 {
    unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
    char buf[];
};

好奇为什么使用 char buf[],而不用char *buf,找到答案记录一下。

struct中的char*和char数组有什么区别

常用来构成缓冲区。比起指针,用空数组有这样的优势:

……

阅读全文

Lastbattle | 游戏场景服务器SS解析

游戏场景服务器概况

5658cf3a9b5eba8535a6e556dbe7da34.png

指令对应的处理handle的文件:SSBattleMgr.cpp

创建战场

  • 指令: eMsgToSSFromCS_CreateBattle
  • GC服务器发往SS fromCS 收到中心服务器CS创建站场的指令,在函数INT32 CSSBattleMgr::OnMsgFromCS_CreateBattle(const char* pData, int n32DataLength)中创建站场成功后,加入到战场管理器中:
m_cAllBattleMap[pBattle->GetBattleID()] = pBattle;

发送创建结果给CS服务器

……

阅读全文

CCnet | 单线程reactor演变为多线程

ccnet从单线程演变为多线程

ccnet现状:

  • epoll
  • linux平台
  • 事件循环
  • 单线程
  • reactor
  • 监听和新连接的事件都在主线程中

单线程的ccnet

98fb4a422ca29f30211176d1b81489fd.png
ccnet的单线程的角色:

  • EventLoop: 整个事件循环。
  • EPollPoller: 负责事件的收集。
  • Channel:负责事件的分发。
  • Acceptor:处理客户端新连接,绑定监听回调时间。
  • TcpConnection: 包含EventLoop组件,Channel组件,接收缓冲区和发送缓冲区,负责数据的收发。
  • TcpServer:包含EventLoop组件,Acceptor组件,客户端连接map,还有回调接口
  • Buffer: 缓冲区

*ccnet的单线程模型只是对epoll进行了封装,然后根据reactor模型在代码上进行了组件的区分,但是整体操作还是单线程,不能充分利用硬件资源。TcpServer的回调函数中,数据接收和业务处理在同一条线程中。

……

阅读全文

Golang | sync.Mutex详解

概述

自己做的一个golang项目需要优化,优化方向是减少gpu内存的使用。同一个模型被重复加载多次,使用更多的gpu内存,也增加 sync.Mutex的使用。
优化的方向是:

  • 减少代码量的改动- 减少gpu内存的使用,同一个模型只用加载一次 涉及的问题:
  • sync.Mutex是传值还是传引用?- sync.Mutex可以拷贝么?- sync.Mutex需要申明为指针么?

sync.Mutex是传值还是传引用?

查看一个例子

……

阅读全文

五种网络IO模型总结

概述

在网络上看到很多关于阻塞IO、非阻塞IO、同步IO、异步IO的例子,总觉得写的过于复杂并且让人难以理解。于是我把我自己把这几个概念的理解写下来以供参考。

POSIX

POSIX(可移植操作系统接口)把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO

……

阅读全文

CCnet | 一个reactor单线程网络库

缘由

最近在研究陈硕的网络库muduo,是一个基于reactor架构的网络库。我对网络库的感觉是易用,但是内容庞大,依赖颇多。比如boost网络库里面的一些语法让人生畏。关于reactor和proactor架构,还有select/poll/epoll网络模型方面的基础理论知识已经掌握,自己也一直想做一个网络库来对自己之前工作的一个总结。muduo整体代码量不多,易读,整个架构也容易理解,于是我模仿muduo写了一个单线程的reactor网络库。

……

阅读全文

C++ | vector中的resize()函数 VS reserve()函数

reserve

void reserve (size_type n);

reserver函数用来给vector预分配存储区大小,即capacity的值 ,但是没有给这段内存进行初始化。reserve 的参数n是推荐预分配内存的大小,实际分配的可能等于或大于这个值,即n大于capacity的值,就会reallocate内存 capacity的值会大于或者等于n 。这样,当ector调用push_back函数使得size 超过原来的默认分配的capacity值时 避免了内存重分配开销。

……

阅读全文

Golang | 用gocolly登录B站

概述

gocolly是golang语言开发的爬虫包,通过gocolly来进行模拟网站的登录,
目标已经确立,开始行动。

下载

$ go get -u github.com/gocolly/colly

获取cookie

登录网站:https://www.bilibili.com/
获取cookie:

……

阅读全文

Protobuf | 沾包问题

缘由

最近在研究一款游戏的源码。发现里面的通信协议是protobuf定义的,但还是自己定义了协议头部,类似 head + body。先解析头部里所存储的整个包的数据长度,然后再解析包剩余的数据,这样做的目的是为了防止沾包。我在想都用了protobuf了为啥不直接用grpc呢。一时想不出,于是我用golnag + protobuf 做了一个简单的client + server

……

阅读全文

Grpc | 概述

OverView

gRPC是由Google主导开发的RPC框架,使用HTTP/2协议并用ProtoBuf作为序列化工具。其客户端提供Objective-C、Java接口,服务器侧则有Java、Golang、C++等接口,从而为移动端(iOS/Androi)到服务器端通讯提供了一种解决方案。 当然在当下的环境下,这种解决方案更热门的方式是RESTFull API接口。该方式需要自己去选择编码方式、服务器架构、自己搭建框架(JSON-RPC)。gRPC官方对REST的声音是:

……

阅读全文