跳至正文

从网速的角度对网络协议(IPv4, IPv6, TCP)查漏补缺

  • 随笔

IPv4

在IPv4的协议头中:
file
存在一个Type of Service,IETF在之后将字段改为Differentiated Service, 即区分服务。该字段用来表达发送端对服务质量的期望程度,例如可以通过在该字段中设置标志位表达发送方希望该IP Datagram低延迟(Low Delay)的效果送达发送端;或希望以高可靠性(High Relibility)的效果送达发送端。

IPv6

提出了 Flow Label 的概念, 可以将一个序列的 IPv6 分组标记为属于某个流, 在传输链路上保证该流的服务质量[……]

继续阅读

C++20协程写法细节

  • 随笔

前言

深入看了coroutine提案作者写的几篇文章,从协程的抽象到实现细节,真的有学到一些东西。但其实我是大概率不会自己基于C++20原生的接口,但是看到几个一定要记的东西,感觉还是可以写篇博客记录一下。

文章原文:
https://lewissbaker.github.io/2017/11/17/understanding-operator-co-await
https://lewissbaker.github.io/2018/09/05/understanding-the-promise-type

协程基础类[……]

继续阅读

协程是泛化的函数——再读协程

  • 随笔

推荐文章:
https://lewissbaker.github.io/2017/09/25/coroutine-theory

是看到上面这篇文章决定简单记录一下,他写的这个描述非常准确而且清晰:普通函数有两个操作,执行和返回。在执行的时候,会创建一个函数帧,同时暂停原函数,在执行返回操作之后恢复原函数。

这句话就有点醒到我,暂停函数的概念不是协程才有,函数本身就有的。或者进一步说,协程是泛化的函数,函数是限定了协程在调用时暂停原函数,返回时恢复原函数;而协程是可以在调用时选择暂停原函数还是新函数,同时可以在函数执[……]

继续阅读

std::map学习笔记

  • C++

本来只是想草草读一下这篇文章:https://142857.red/book/stl_map/
但是还是发现一些值得记录的点,在这里记录一下:
[]读取不存在的key会报错

map<string, int> config = {
    {"timeout", 985},
    {"delay", 211},
};
print(config["timeout"]); // 985
print(config["tmeout"[......]

继续阅读

编译clang搞清楚的一些概念(gcc, llvm, clang, libc++, libstdc++)

  • 技术

clang++/llvm

因为开发机的gcc版本太低了,就重新编译了一个clang,大概了解了一下这些底层工具的概念。

clang++和clang都是llvm的一部分,而llvm是一个庞大的、模块化编译器的项目,clang++只是基于llvm的编译器前端。

所以对于一个C++编译过程,从.cpp生成.o,在llvm的这个项目下的流程是:

  1. clang++对源代码进行词法分析,转化成抽象的AST树;
  2. clang++再将AST转化成中间表示(IR)
  3. 生成IR之后,llvm编译框架对这个中间进行优化;
  4. 接着llvm的后端[……]

    继续阅读

[Walo系列]3. 序列化和rpc的选型与思考

  • 随笔

rpc库

决心推进这个计划之后就开始预研各种序列化和rpc库,看了很多对比,也做了一些测试,在这里统一记录一下。

仔细看来序列化做的事情就是把数据打包,rpc要考虑的核心事情是如何把函数的形参和返回类型同步给双端。

我看rpc库好像也只有两种形式,一个是通过proto定义好,例如grpc;另外一个是直接直接在调用的时候限定,属于一种硬编码?类似于rpclib

浅浅地看了三个rpc库:

  • rpclib
  • grpc
  • capnproto

通过各自的手段定义rpc的消息协议,然后可以快速简单地开始写一个网络通信程序。但是基[……]

继续阅读

[Asio] 学习笔记1. 初识asio和tcp

打算基于asio写多种序列化库的测评,在底层用同一个asio构造函数的方式,然后上层测试脚本里切换序列化的实现。
但是最开始按着demo写逻辑就出现了问题,我想先纯面向过程,就没像demo里写一个connection类,然后就探究到一直会闪退的问题。

最后定位到时ip::tcp::socket析构的时候会断开连接。

socket的析构会断开连接

socket的大概是这样的结构:

typedef basic_stream_socket<tcp> socket;
template <typename[......]

继续阅读

[Walo系列]2.企划和环境搭建

  • 随笔

企划

还是打算启动这个企划,核心的目标就像前一篇说的,我想做一个游戏的网络rpc的库。相比传统的rpc框架,核心在于这个是给游戏用的。

思考

游戏用的rpc和互联网的主要差别在哪呢?
这几天我一直在思考这个问题,互联网的请求更多的是我发起、等待然后收到回调。同时互联网有大量的基础设施,在rpc的通信中有大量的扩散的请求。例如一个订单可能涉及到向多个微服务发起服务,最终汇聚成一个请求返回到客户端。

互联网的rpc更注重跨语言,快速实现需求,还要考虑多服务的均衡、容灾等等…

而游戏的网络框架其实分两个部分,拿平安京举例[……]

继续阅读

[Walo系列]1.开发自己的游戏通讯库对grpc祛魅了

  • 随笔

本意是想深入研究和学习一下grpc的设计,来给自己的游戏网络通信引擎提供多一份参考。但是细致的看了一圈文档意识到grpc的实际应用场景不是给游戏,而是像文档里描述的给微服务和多语言部署的大型业务。

grpc作为定义好comn中间结构体就能够注册到服务发现集群,其他的业务可以直接将comn结构下载下来,快速地请求到新业务的一套跨越多语言的协议+底层框架。

这是它的核心,或者说它解决的问题。

就忽然想起来之前华仔说面试的是时候是要问对方解决问题的能力,遇到了什么问题,提出了什么方案。

最近也研究godot和unreal[……]

继续阅读

用python理解C++20协程的设计

C++20拥有一个全新的特性:协程。

我来从python的角度来解释C++这个特性设计与其他语言的不同,目的以及意义。

协程是一种可以挂起和恢复执行的函数。C++20协程跟python的生成器是很相似的,如果函数中出现了co_yield, co_return, co_await,那么这个函数就是协程函数。而协程的本质就是将一个函数拆分成多个不能控制执行顺序,但是可以控制执行时机的语言结构。

对普通函数而言,执行一个函数是开始运行你的逻辑;但是对于协程来说,执行协程函数会先创建一个协程对象,但是是否开始执行还是挂起是[……]

继续阅读