自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 收藏
  • 关注

原创 13 协程设计原理与汇编实现

如何定义协程*(线程)enum{//运行的状态CO_NEW;//新建CO_READY;//就绪CO_WAIT;//等待CO_SLEEP;//睡眠CO_EXIT;//退出int coid;//id//上下文//入口函数void *arg;//入口函数的参数//独立栈(每个协程不影响)*共享栈//栈的大小//就绪队列//睡眠队列//等待队列//退出队列考虑用那些数据结构来表示这几个状态:100个coroutine//用队列20个ready//30个sleep//

2024-07-08 15:38:56 855

原创 12 基于UDP实现可靠传输——KCP协议

关于KCP,我们可以把它理解为我们自定义了一个可靠的传输协议,它的底层协议采用的UDP,对于UDP我们可以理解成,操作系统的协议栈,给我们提供的最小的一个传输单元。KCP是一个基于UDP实现的可靠传输协议,它在UDP的高效性基础上,通过引入类似于TCP的控制机制,如重传、拥塞控制、流量控制等,实现了数据的可靠传输。当选择了快速重传,发送端发送了1,2,3,4,5几个包,然后远端的ACK:1,3,4,5.当收到了ack3时,返端不需要等待RTO超时,直接重新发送。这样可以做到更快的重传,但对带宽的浪费更大。

2024-07-04 20:53:08 668

原创 11 UDP的可靠传输协议QUIC

发送方和接收方都会维护一个数据帧的序列,这个序列被称作窗口。发送方的窗口大小由接收方确定,目的在于控制发送速度,以免接收方的缓存不够大,而导致溢出,同时控制流量也可以避免网络拥塞。协议中规定,对于窗口内未经确认的分组需要重传.

2024-07-04 11:51:29 882

原创 10 Posix API与网络协议栈

POSIX是由IEEE指定的一系列标准,用于澄清和统一Unix-y操作系统提供的应用程序编程接口(以及辅助问题,如命令行shell实用程序),当您编写程序以依赖POSIX标准时,您可以非常肯定能够轻松地将它们移植到大量的Unix衍生产品系列中(包括Linux,但不限于此!如果你使用的某些Linux API没有标准化为Posix的一部分,那么如果你希望将来将该程序或库移植到其他Unix-y系统(例如MacOSX)。

2024-07-02 15:54:40 1056

原创 9 redis,memcached,nginx网络组件

课程目标:1.网络模块要处理哪些事情2.reactor是怎么处理这些事情的3.reactor怎么封装4.网络模块与业务逻辑的关系5.怎么优化reactor?read就是将东西从read buffer(读缓冲区)中读出。write就是将东西从write buffer(写缓冲区)中写入。对于客户端而言,怎么知道链接建立成功,主要通过connect返回值(三次握手时是否收到服务端的ack)上面函数都是同步io。,reactor是事件驱动。

2024-07-01 17:57:29 1069

原创 8 https服务器的实现

这个代码核心就是我们首先监听一个8000接口,然后再服务器上访问这个接口,会得到一些https头文件。之后我们定义该目录为http的根目录,然后就可以访问该目录下的html文件了。如果我们要做一个http服务器的话,我们要注意几点。然后我们回复一个html,再网页上显示。

2024-06-26 21:34:37 189

原创 7 reactor服务器模型

接上节课,上节课中,我们使用了epoll实现了同时监听多个文件描述符,是对IO的管理,也提到了reactor是对事件的管理,那具体来说是怎样的呢?reactor是事件驱动模型,也就是EPOLLIN/EPOLLOUT,同时,我们应该维护一种结构,对于每个fd,都应该有这样一种记录该fd相关的结构。再往后,为了提高处理能力,我们可以将clientfd相关的读写操作放到子线程去做,而主线程只负责appect等等,这就涉及到不同的网络编程模型,之后再谈。接收和发送回调同理。

2024-06-26 16:42:40 225

原创 ubuntu中安装docker并换源

Docker 包被命名为 docker.io,因为在 Docker 出现之前就已经存在一个名为 docker(用于 Dockerlet 应用)的过渡包。因此,Docker 包必须被命名为其他名称。docker -v。

2024-06-16 20:59:46 915

原创 20. mediasoup服务器的布署与使用

服务端提供3个服务:1.www服务,浏览器通过访问服务器目录获取客户端代码,通过V8引擎,启动底层WebRTC2.nodejs提供websocket服务和http服务,用于信令交互3.Mediasoup C++提供的流媒体服务,用于音视频的分享与抓取。

2024-06-16 15:25:54 571

原创 19. 各流媒体服务器对比

WebRTC 本身提供的是 1 对 1 的通信模型,在 STUN/TURN 的辅助下,如果能实现 NAT 穿越,那么两个浏览器是可以直接进行媒体数据交换的;如果不能实现 NAT 穿越,那么只能通过 TURN 服务器进行数据转发的方式实现通信。目前来看,Google 开源的用于学习和研究的项目基本都是基于 STUN/TURN 的 1 对 1 通信。如果你想要通过 WebRTC 实现多对多通信,该如何做呢?

2024-06-14 21:18:42 921

原创 18. SDP协议

SDP(Session Description Protocol)它只是一种信息格式的描述标准,本身不属于传输协议,但是可以被其他传输协议用来交换必要的信息。

2024-06-13 11:38:56 854

原创 17 媒体协商过程

我们要弄清楚媒体协商过程,首先要认识我们WebRTC中最重要的一个类RTCPeerConnection。媒体协商过程媒体协商的过程在我们使用RTCPeerConnection这个方法之前呢,我们要了解他的协议是什么,媒体是怎样协商出来的?我们再看这些API的时候就知道这个调用是非常简单了,否则的话,你即使拿到了这些API,也不知道怎么用。但是它的协商过程呢,就如这张图所示对于这两个端来说,一个假设是A,第二个是B。

2024-06-12 20:58:04 723

原创 16 DTLS协议

非对称加密就是公钥上的锁,私钥才能打开,私钥上的锁公钥才能打开。比如说就是地下党接头的时候,把一个信息放在盒子里,然后这个盒子只有我能打开,这个盒子谁都可以放信息,但是只有要接收信息的那个人能打开。

2024-06-12 17:47:01 865

原创 15. STUN协议和ICE工作原理

在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet。很多时候,我们希望网络中的两台主机能够直接进行通信,即所谓的P2P通信,而不需要其他公共服务器的中转。由于主机可能位于防火墙或NAT之后,在进行P2P通信之前,我们需要进行检测以确认它们之间能否进行P2P通信以及如何通信。这种技术通常称为NAT穿透(NAT Traversal)。最常见的NAT穿透是基于UDP的技术,如RFC3489中定义的STUN协议。

2024-06-12 11:46:05 865

原创 14. RTCP 协议

BYE指示一个或者多个源退出会话。协议ID:203。参与者发送 BYE 数据包以指示一个或多个源不再活动,可选择给出离开的理由。作为可选项,BYE包可包括一个8位八进制计数,后跟文本信息,表示离开原因,如:“cameramalfunction"或"RTPloop detected”。字符串的编码与在SDES 项中所描述的相同。如字符串信息至BYE包下32位边界结束处,字符串就不以空结尾;否则,BYE包以空八进制填充。

2024-06-10 20:42:23 1010

原创 13 RTP包的使用

对于发送者来说,视频的每一个帧都有很多包组成。对于接收端来接收的时候是有一个队列进行接收的。这个队列大小都是通过计算的。有了队列之后就会不断的往队列中插入数据。当队列中有的数据超时一直组不成包的时候,就把他丢弃掉,当这些包没有超时的话,就一直在队列中等待,直到组成一个帧后,将该帧推出去。这时候在103,没来的时候104来了,那么把104放在自己位置上就行。107来了就放在107自己位置上,这时候如果103来了之后,组成一个帧了,这时候104有个M标志,表示前面这些可以组成一个帧,就把该帧推出去。

2024-06-10 17:14:14 199

原创 13. UDP协议与RTP协议

RTP(Real-time Transport Protocol)是用于 Internet 上针对多媒体数据流的一种传输层协议,RTP 协议和 RTP 控制协议 RTCP 一起使用。RTP 被定义为在一对一或一对多的传输情况下工作,其目的是提供时间信息和实现流同步。RTP 的典型应用建立在 UDP 上,但也可以在 TCP 或 ATM 等其他协议之上工作。

2024-06-10 16:02:58 1400

原创 12 TCP协议

首先我们先看看这个TCP/IP协议栈,上个博客写了IP协议头(IP Header)。

2024-06-08 21:13:44 857

原创 11 IP协议 - IP协议头部

IP(Internet Protocol)是一种网络通信协议,它是互联网的核心协议之一,负责在计算机网络中路由数据包,使数据能够在不同设备之间进行有效的传输。IP协议的主要作用包括寻址、分组、路由和转发数据包,并为上层协议提供无状态、无连接、不可靠的服务。注意,IP协议负责的是数据包的路由。其作用类似于邮政系统中的邮政地址。它为数据包提供了唯一的地址,并规定了如何将数据包从发送方路由到接收方。举个例子理解一下:想象一封电子邮件从您的计算机发送到朋友的计算机。在这个过程中,IP协议充当了邮递员的角色。

2024-06-08 17:59:06 994

原创 虚拟机【VMware】与Windows之间不能复制粘贴的解决方法

以上可以的话,就不用往下看了。然后重启下虚拟机就可以了。

2024-06-05 17:43:09 371

原创 Ubuntu 无法定位软件包 yum

在安装yum时出现。

2024-06-04 17:29:14 337

原创 10. C++异步IO处理库和使用libevent实现高性能服务器

1)basestruct event_base类型的指针,表示事件集合2)cbevconnlistener_cb类型的回调函数指针,用于处理新连接的事件,连接之后就会调用这个回调函数。其中:evconnlistener_cb类型。

2024-05-28 21:15:03 1181

原创 9. C++通过epoll+fork的方式实现高性能网络服务器、线程和进程的关系

epoll+fork 实现高性能网络服务器一般在服务器上,CPU是多核的,上述epoll实现方式只使用了其中的一个核,造成了资源的大量浪费。因此我们可以将epoll和fork结合来实现更高性能的网络服务器。创建子函数–fork( )要了解线程我们先来了解fork()函数:fork() 函数的功能是在当前的进程创建一个子进程;在多核时代,CPU管理多个进程,一个单核CPU同一时间只能运行一个进程,比如8 核的 CPU 只能同时运行 8 个进程。但是一个进程中可以有多个线程并行运行。

2024-05-27 18:01:58 1120

原创 8. C++通过epoll的方式实现高性能网络服务器

就好比接收快递一样,select就是快递员上门挨家挨户遍历去问有没有快递,而epoll不同,epoll就好比在楼下放一个箱子,然后谁有快递就将快递放在楼下箱子里面,也就是那个事件触发,就在箱子里面遍历就行。

2024-05-27 12:00:56 717

原创 7. C++通过select的方式实现高性能网络服务器

阻塞IO指的是用户程序将IO请求提交后,无需等待IO操作的完成,而是可以继续处理别的事情。所谓阻塞IO,是指以事件触发的机制来对IO操作进行处理。与多进程和多线程技术相比,阻塞I/O技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。我们举个例子吧:假如说我们要去读一个数据,我们要发生系统调用,然后去询问IO是否准备好了,对于阻塞I/O,如果没有准备好的话,他就会一直等,一直等,直到他准备好了。然后再进行下一步操作。

2024-05-26 21:18:04 339

原创 6. C++通过fork的方式实现高性能网络服务器

我们上一节课写的tcp我们发现只有第一个与之连接的人才能收发信息。他又很多的不足。

2024-05-26 16:35:47 419

原创 5. C++网络编程-UDP协议的实现

UDP是无连接的。

2024-05-25 16:39:34 406

原创 4. C++网络编程-TCP客户端的实现

C++网络编程-TCP客户端的实现

2024-05-25 16:15:12 302

原创 3. C++网络编程-TCPServer实现原理

二者长度一样,都是16个字节,即占用的内存大小是一致的,因此可以互相转化。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息,是一种通用的套接字地址。sockaddr_in 是internet环境下套接字的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作,使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。

2024-05-24 18:09:18 705

原创 2. C++服务器编程-信号

其实信号就是一个中断。就是在执行程序的时候突然来了一个信号,然后我们去执行这个新来的程序了,这就是中断。

2024-05-24 16:19:02 141

原创 1. C++实现一个最简单的服务器和五种I/O模型

2024-05-24 15:52:00 134

原创 6. C++网络编程-网络io与io多路复用select/poll/epoll

首先看看这个学习计划samba配置可以看这个。

2024-05-15 18:01:48 247

原创 Ubuntu 配置Samba

测试中发现使用另一个ubuntu机器上的smbclient连接需要开放目标机器的139端口,而windows连 接需要开放目标机器的445端口,不清楚是不是固定的,可以自行尝试。user - smb.conf中添加的配置信息中[user]填的共享名。再重新尝试windows连接,如果能成功,原因就是ufw配置有问题。查看ufw的app list是否有samba。ip_addr - ubuntu的ip地址。此时可能时防火墙的问题,可以先将防火墙关闭。这里我设置的密码为123456。查看ufw的端口开放情况。

2024-05-15 16:38:07 271

原创 分布式版本控制工具git

这就是我们一个完整的提交流程。我们再工作区写代码,然后我们可以通过git.add将修改的代码提交到暂存区,然后,通过git.commit将暂存区的东西提交到本地仓库,然后,通过git.push将本地仓库里的东西提交到远端仓库。

2024-05-13 21:32:12 884

原创 C++-Linux工程管理

假如我们有一个深度学习框架的部分工程列表,里面有超过40个互相调用的工程共同组成,一些用于生成库文件,一些用于实现逻辑功能。他们之间的调用关系复杂而严格,如果我想在这样复杂的框架下进行二次开发,显然只拥有它的源码是远远不够的,还需要清楚的明白这几十个项目之间的复杂关系,在没有原作者的帮助下进行这项工作几乎是不可能的。即使是原作者给出了相关的结构文档,对新手来说建立工程的过程依旧是漫长而艰辛的,因此CMake的作用就凸显出来了。

2024-05-13 11:22:29 915

原创 C++新特性-线程

下面以。

2024-05-08 21:07:47 694

原创 浅谈深拷贝和浅拷贝

如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题: p1在进行有参初始化时,在堆区申请了一个空间,p1的height指针就指向这个空间,p2在进行拷贝初始化时使用的是编译器提供的浅拷贝,浅拷贝是对成员变量的简单赋值,指针传递的是地址,所以p2的height指针=p1的height指针,即两个height指针指向堆区的同一个地址,函数test01结束后,p1和p2把同一个空间释放了两次,所以程序崩了。但是深拷贝还有一个问题,就是如果要拷贝的很多的话,会很慢,这就要移动拷贝构造函数了。

2024-05-05 21:37:02 626

原创 C++新特性

左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。int a = 6;a可以通过 & 取地址,位于等号左边,所以a是左值。6位于等号右边,6没法通过 & 取地址,所以6是个右值。int a_;A a = A();同样的,a可以通过 & 取地址,位于等号左边,所以a是左值。A()是个临时值,没法通过 & 取地址,位于等号右边,所以A()是个右值。可见左右值的概念很清晰,有地址的变量就是左值,没有地址的字面值、临时值就是右值。

2024-05-05 18:02:16 672

原创 C++设计模式-结构型设计模式

保证一个类仅有一个实例,并提供一个该实例的全局访问点。——《设计模式》GoF定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。——《设计模式》GoF为什么要有工厂模式,而不直接使用new?除了new,还有复杂构造流程要点解决创建过程比较复杂,希望对外隐藏这些细节的场景;比如连接池、线程池隐藏对象真实类型;对象创建会有很多参数来决定如何创建;创建对象有复杂的依赖关系;本质延迟到子类来选择实现;结构图。

2024-05-04 18:37:35 900 1

原创 C++设计模式-创建型设计模式

定义一个操作中的算法的骨架 ,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。——《 设计模式》 GoF某个品牌动物园,有一套固定的表演流程,但是其中有若干个表演子流程可创新替换,以尝试迭代更新表演流程;这个和上面定义差不多。要点最常用的设计模式,子类可以复写父类子流程,使父类的骨架流程丰富;反向控制流程的典型应用;父类 protected 保护子类需要复写的子流程;这样子类的子流程只能父类来调用;本质。

2024-05-03 17:11:13 1246

tcp_server and tcp_client.zip

tcp_server and tcp_client

2024-05-25

tcp客户端和服务器端

tcp客户端和服务器端

2024-05-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除