Unix Domain Socket
连接过程总的来说,基于 UDS 的连接过程比 inet 的 socket 连接过程要简单多了。客户端先创建一个自己用的 socket,然后调用 connect 来和服务器建立连接。
在 connect 的时候,会申请一个新 socket 给 server 端将来使用,和自己的 socket 建立好连接关系以后,就放到服务器正在监听的 socket 的接收队列中。 这个时候,服务器端通过 accept 就能获取到和客户端配好对的新 socket 了。
总的 UDS 的连接建立流程如下图。
我们找到 connect 函数的具体实现,unix_stream_connect。1234567891011121314151617181920212223242526//file: net/unix/af_unix.cstatic int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr, int addr_len, int flags){ struct sockaddr_un *sunaddr
...
CPP易错点记录
拷贝构造函数和赋值运算符在默认情况下(用户没有定义,但是也没有显式的删除),编译器会自动的隐式生成一个拷贝构造函数和赋值运算符。但用户可以使用delete来指定不生成拷贝构造函数和赋值运算符,这样的对象就不能通过值传递,也不能进行赋值运算。拷贝构造函数必须以引用的方式传递参数。这是因为,在值传递的方式传递给一个函数的时候,会调用拷贝构造函数生成函数的实参。如果拷贝构造函数的参数仍然是以值的方式,就会无限循环的调用下去,直到函数的栈溢出。拷贝构造函数使用传入对象的值生成一个新的对象的实例,而赋值运算符是将对象的值复制给一个已经存在的实例。拷贝构造函数也是一种构造函数,那么它的功能就是创建一个新的对象实例;赋值运算符是执行某种运算,将一个对象的值复制给另一个对象(已经存在的)。调用的是拷贝构造函数还是赋值运算符,主要是看是否有新的对象实例产生。如果产生了新的对象实例,那调用的就是拷贝构造函数;如果没有,那就是对已有的对象赋值,调用的是赋值运算符。
123456789101112131415161718192021222324252627282930313233343536373839404
...
C Plus学习笔记之二
基类与派生类的关系:
派生类对象可以使用基类的方法,条件是方法不是私有的。
基类指针可以在不进行显示类型转换的情况下指向派生类对象。
基类引用可以在不进行显示类型转换的情况下引用派生类对象。
C++有三种继承关系:公有继承、保护继承和私有继承。
公有继承是最常用的方式,它建立一种is-a关系,即派生类对象也是一个基类对象,可以对基类对象执行任何操作,也可以对派生类对象执行。注意:is-a关系通常是不可逆的,也就是说,水果不是香蕉。公有继承不能建立has-a、is-like-a、is-implemented-as-a、uses-a关系。
多态公有继承:在派生类中重新定义基类方法。使用虚方法virtual,该关键字只出现在方法原型中。对于虚函数,程序将根据对象类型来确定使用哪个版本。对于两个对象中行为相同的方法,只在基类中声明。如果没有使用关键字virtual,程序将根据引用类型或指针类型选择方法;如果使用了virtual,程序将根据引用或指针指向的对象的类型来选择方法。方法在基类中声明为虚拟的后,它在派生类中将自动成为虚方法,一般也都在派生类中指出。为基类声明一个虚拟析构函数也是
...
python记录
在 Python 中,yield 是一个关键字,用于定义生成器函数。生成器函数可以像正常的函数一样定义,带有参数和代码块,在调用时返回一个迭代器。但与普通函数不同的是,当函数遇到 yield 关键字时,它会暂停执行并返回一个值给外部的调用者。然后,当下一次调用 .next() 或者 next() 方法时,函数会从上次暂停的位置继续执行。
以下是一个简单的例子:123456789101112131415def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b# 调用生成器函数f = fibonacci()# 使用 next() 函数获取下一个值print(next(f)) # 输出:0print(next(f)) # 输出:1print(next(f)) # 输出:1print(next(f)) # 输出:2print(next(f)) # 输出:3
在上面的例子中,我们定义了一个名为 fibonacci 的生成器函数,它用来生成斐波那契数列。每次调用 next(f) 时,它都
...
etcd分布式注册服务中心
说明etc在linux系统中是配置文件目录名;etcd就是配置服务。诞生于CoreOS公司,最初用于解决集群管理系统中os升级时的分布式并发控制、配置文件的存储与分发等问题,基于此,etcd设计为提供高可用、强一致性的小型kv数据存储服务。etcd基于go语言实现,主要用于共享配置、服务发现、集群监控、leader选举、分布式锁等场景,用于存储少量重要的数据。当客户端需要调用某个服务时,它可以向服务注册中心发送查询请求,以获取特定服务的可用节点列表。然后,客户端可以选择其中一个节点进行调用。
架构12345etcdctl get key -w json{"header": {"cluster_id":1481639068965178418, "member_id":10276657743932975437, "revision": 47, "raft_term":8}, ...}etcdctl get key --rev=47etcdctl lease grant 30etcdctl put key test --lease=33435
raft
...
golang开发
工具安装https://studygolang.com/dl下载最新版本。123456789101112yum install epel-releaseyum updateyum install golangsudo tar -C /usr/local -xzf go1.13.linux-amd64.tar.gzls /usr/local/bin/ etc/ games/ go/ include/ lib/ man@ sbin/ share/ src/sudo vim /etc/profile# 末尾添加export PATH=$PATH:/usr/local/go/binsource /etc/profilego version
项目实战jupiterhttps://jupiter.douyu.com/jupiter/
chathttps://github.com/tinode/chat123456789101112# The steps above install Tinode binaries at $GOPATH/bin/, sorces and suppor
...
nodejs开发
基础npx的全称是Node Package Runner,是一个命令行工具,它可以在不安装包的情况下直接运行Node.js包中的命令。npx的作用类似于npm全局安装包,然后在命令行中执行安装包里的命令,但npx不需要提前安装,它会自动下载所需的包并执行命令。因此,npx被称为“npm 5.2.0+附带的一个功能”。在 npx 命令后加上 ts-node 命令 tsx,表示使用 ts-node 解析并运行 TypeScript 文件。这种方式可以避免在本地全局安装 ts-node,而且方便在多个项目中使用不同版本的 ts-node。
在 TypeScript 中,?. 表示可选链操作符,它用于访问可能不存在的属性或方法。在旧版的 JavaScript 中,当试图访问一个不存在的属性或方法时,程序会抛出一个类型为“undefined”的错误。在 TypeScript 中,可以使用可选链操作符?. 来避免这种错误,当访问的对象或属性不存在时,表达式会直接返回 undefined,而不会抛出错误。
异步jsXHR 有 5 种状态:XMLHttpRequest.readyState|Value
...