- 博客(119)
- 资源 (3)
- 问答 (1)
- 收藏
- 关注
原创 网络编程 - 探究一些容易忽略的细节
下定论:在网络通信过程中,连接的建立是在协议栈中处理的,这一步是内核完成的,与用户应用层无关。TCB和fd是收到不同模块管理的,FD是由文件系统管理,在close就会被回收。查看状态,发现在2048,正在LISTEN状态,等待连接。一个网络IO就是FD,有时候表述为soock。即使并没有接收,数据也可以发送到对方的。
2024-04-09 16:52:34 250
原创 KCP协议
在网络中,我们认为传输是不可靠的,但是在很多实际的场景中,我们需要得到可靠的数据。得到可靠的数据:数据能够正确到达并且有序。(注意这里有两个条件,一个是有序,一个收到为了达到这个目的,操作系统的协议栈的传输层采用了ARQ协议。TCP采用的就是AQR协议。为什么通常我们认为网络上的传输是不可靠的?(GPT回答,这里我们稍微了解一下)1.数据包丢失:在网络传输过程中,数据包可能会因为各种原因丢失,例如网络拥塞、错误路由等,这会导致传输中部分数据丢失或损坏。
2024-04-09 16:51:52 1004
原创 体现libevent实质上干了啥事-libevent与epoll
/------------------------ 事件管理 ---------------------------------////------------------------ 事件管理 ---------------------------------//(flags & O_NONBLOCK)) // 如果没有设置非阻塞。(flags & O_NONBLOCK)) // 如果没有设置非阻塞。// 将套接字(FD)设置成非阻塞。// 将套接字(FD)设置成非阻塞。// 设置套接字为非阻塞。
2024-02-07 20:52:17 1495
原创 epoll实现同时承载100w客户端的数量
让epoll能够同时承受100w的连接,对于百万并发的业务处理,其前提条件就是要同时承受住100w的连接。
2023-12-10 19:15:42 844 2
原创 No source control providers registered
No source control providers registered
2023-11-10 23:16:06 418
原创 网络缓冲区
网卡是计算机里的一个硬件,专门负责接收和发送网络包,当网卡接收到一个网络包后,会通过DNA技术将网络包写入到指定的内存地址,也就是写入到RingBuffer中,这是一个环形缓冲区。接着网卡向CPU发起硬中断,当CPU收到硬件中断请求后,根据中断注册表,调用已经注册的中断处理函数(中断处理函数:暂时屏蔽硬中断、发起软中断-->通知内核里的ksoftirqd线程进行轮询从ringbuffer中读数据、恢复中断)....
2023-11-10 12:54:34 331
原创 reactor (百万并发服务器) -- 1
reactor是一种面向事件的IO处理方式...后续文章将进行wsl测试已经对buffer进行优化,设计合理的用户缓冲区,而不是使用定长的buffer进行实现。然后会对代码进行调整,目前的设计不方便提取出来使用,我们最后会封装成一个库的方式,提供一个.h和.c文件,以此方便移植。
2023-10-31 22:27:38 562 1
原创 windows + ubuntu + vscode开发环境配置安装
从零搭建Linux +windows + VSCode +C/C++开发环境
2023-10-27 01:03:46 1781 8
原创 MFC - 一文带你从小白到项目应用(全套1)
return 0;WINAPI是一个宏,表示参数从右往左入栈,同时在函数返回前自动清空堆栈hInstance:(当前应用程序的句柄)一个应用程序的的实例句柄,一个应用程序可以运行多个实例,每一个运行的应用程序都会有一个句柄,通过hInstance传递给WinMain函数当前实例的前一个实例句柄,通常传NULLIpCmdLine:一个字符串数组,传给给应用程序的命令行参数,相当于 char* argv[]nShowCmd:窗口显示的方式,最大化/最小化/正常显示/隐藏显示。
2023-09-17 17:46:31 432
原创 C 通过宏定义重定义malloc - free,预防内存泄露
C 通过宏定义重定义malloc - free,预防内存泄露支持多线程,不支持多进程,如果想要支持多进程,相关的控制部分定义到共享内存中详细输出信息
2023-09-17 17:31:20 544
原创 C++模版基础
本专栏会持续更新关于STL中的一些概念,会先带大家补充一些基本的概念,再慢慢去阅读STL源码中的需要用到的一些思想,有了一些基础之后,再手写一些STL代码。(如果你有喜欢一些底层封装,执着于造轮子,我想这个一期不错的专栏)
2023-09-14 23:53:07 512
原创 CMakeList.txt -- 编写保姆式教程
cmake是一种高级编译工具,所有的操作系统都是通过编译CMakeList.txt来完成的,当多个人用不同的语言或者编译器开发同一个项目的时候,最终要输出一个可执行文件或者共享库的时候使用cmake很方便。cmake不同版本下载地址。
2023-05-14 18:23:06 1347 1
原创 mongoose使用详细 -- 如何通过mongoose搭建服务器
根据官网文档给出的描述大致总结下:1.mongoose是一个用于C/C++的网络库,它为TCP、UDP、HTTP、WebSocket、MQTT实现了事件驱动的非阻塞API。Mongoose使嵌入式编程快速、健壮、简单。2.mongoose可在windows、Linux、Mac和许多嵌入式架构上运行。它可以在现有的操作系统和TCP/IP堆栈(如FreeRTOS和lwIP)上运行,也可以在裸机上运行,利用Mongoose内置的TCP/IP堆栈和网络驱动程序。
2023-05-02 22:25:53 7031
原创 论接口的封装能力
额,看不可的效果不可描述,总感觉很多时候看不明白,所以塞,不如看源码里的例子,遇到具体的点没明白的再去百度或者请教前辈。说白了,就是A实现了某种方法(类A不对外使用),而在A-inerface中声明一个A *pA,并且这套接口的方法内部就是调用了A的方法,有时候可能会做一些扩展,比如一个基础事件的集合,也就是有很多这样的事件。对于第一种情况,就不过多的描述了,很简单的。(说人话,无非就是我给你这个接口就可以让你实现这个功能,不需要你去了解里面怎么玩的,想那么多干嘛,那是我封住接口的人需要考虑的塞)
2023-04-28 20:47:30 981
原创 一文带你吃透红黑树---红黑树如此简单
找了很久的红黑树代码,没找到完整的。。。无奈之后自己写一份红黑树代码==>全网c++红黑树最全代码想要玩转红黑树,要对模仿的玩法有一定的了解。我们在玩魔方时只要我们按照规则来,无论你的过程和步骤如何复杂或者如何简单,最后能够使每个面只要一种颜色结算成功。(杠精请离开:以3*3魔方为例)。玩红黑树也是一样的,只要按照规则(左旋、右旋、变色)来无论你中间的过程如何,最后都能写出红黑树(每一个人的步骤顺序可能不一样,其实原理都一样)。
2023-02-05 18:45:11 1272 2
原创 C++实战-基于c++11新特性的mysql连接池
1.如果不使用连接池,每次server端与数据库的交互都需要创建线程和销毁线程。大量的创建线程和销毁线程是消耗系统资源的2.mysql数据库与服务器端的是通过TCP进行通信的,按照TCP的通信规则,需要建立连接和断开连接,这一过程相对比较慢和繁琐3.每次连接都需要进行身份验证通过预先创建一定数量的连接,放到一个池子。当客户端有请求时,服务器端需要与mysql进行交互,那么只需要从池子里取出一个连接,当操作完成再将连接放到连接池中。如此以来避免了频繁的创建和销毁线程。
2022-10-01 19:22:02 1867
原创 近日找实习总结
这一部份蛮重要的,不要从网上乱抄。切忌不要说一堆没用的空话。比如:我做事认真XXX,我XXX.....要用事实说话,具体可以参照我的进行修改。
2022-09-28 18:05:03 1874 24
原创 C++项目实战--线程池代码讲解
使用线程池可以减少线程的销毁,而且如果不使用线程池的话,来一个客户端就创建一个线程。比如有1000,这样线程的创建、线程之间的调度也会耗费很多的系统资源,所以采用线程池使程序的效率更高。线程池就是项目启动的时候,就先把线程池准备好。通过while不断让工作线程的请求工作队列,如果工作队列不为空,则获取一个任务并处理。将互斥锁、条件变量、线程池是否关闭的状态、工作队列封装到一起,然后通过智能指针(共享的)来操作管理这些条件。这段代码是通过c++14写的,我们主要看逻辑关系和实现的原理。
2022-09-01 23:28:57 1275 2
原创 C++项目实战-实际应用
典型IO的两个阶段(网络IO)Linux上的五种IO模型1.阻塞 blocking2.非阻塞3.IO复用4.信号驱动5.异步Web ServerHTTP协议(应用层的协议)简介概述工作原理HTTP 请求报文格式HTTP响应报文格式HTTP请求方法HTTP状态码服务器编程基本框架两种高效的事件处理模式Reactor模式Proactor模式模拟 Proactor 模式线程池有限状态机EPOLLONESH...
2022-09-01 15:44:20 5843
原创 C++项目实战-socket编程
假设我们让发送数据的一端总是以大端字节序发送(对就是做一个统一的规定),那么接收数据的一端就知道我接受到的字节序总是大端字节序,如果接受方的字节序为小端,那么只需要大端数据装换成小端字节序就可以了。因此,Linux定义了下面这个新的通用的socket地址结构体,这个结构体不仅提供了足够大的空间用于存放地址值,而且是内存对齐的【内存对齐可以加快CPU访问速度,内存对齐问题见我的C语言专栏,有详细介绍】socket本意上“插座”的意思,在Linux环境中,用于表示进程间网络通信的特殊文件类型。...
2022-08-27 08:47:29 15070 2
原创 C++实战项目-网络编程基础包含TCP详解
本篇从网络结构模式(网络应用程序设计模式)开始到TCP详解。对于网络编程的所有基础知识一文全部概述。清晰的表达,特别的解释方式,小白也能够看懂,带你打好socket编程的基础。(重点:对TCP从根上进行刨析)
2022-08-24 18:47:37 5332 4
原创 C++实战-仿QQ项目终端版通信
管道设计:管道是半双工通信的,所以我们向两端相互通信的情况下,最好是设计两个管道,由于客户端向服务器端发送数据的时候,服务器端是统一个的,而且管道是队列结构的,所以所以客户端可以向同一个管道中写数据,服务器从这个管道中依次读数据就行。IPC通信的方式有很多种,我们选择一个相对简单的方式安吧。这里的协议不是网络中的协议,只是单纯的为了区别:登录、交流、不在线、退出等状态【客户端可能会出现的状态】客户端会有在线、退出的状态,而且相对来说是很频繁的操作,那么根据链表方便插入和删除操作,我们进行封装,方便传输。
2022-08-22 01:16:19 1318 1
原创 C++实战-Linux多线程(入门到精通)
1.进程间的信息难以共享。由于除去只读代码段外,父子进程并未共享内存,因此必须采用一些进程间通信方式,在进程间进行信息交换。2.调用fork()来创建进程的代价相对较高(复制一份地址空间),即便采用"写时复制"机制,仍然需要复制诸如内存页表和文件描述符表之类的多种进程属性,这意味着fork()调用在时间上的开销依然不菲3.线程之间能够方便、快速地共享信息,只需要将数据复制到共享(栈不行,见上图)变量中即可4.创建线程比创建进程通常要快10倍甚至更多。
2022-08-20 23:47:19 4482 1
原创 C++项目实战-信号
信号的概念信号的共性使用信号的目的信号的机制信号的特质信号的状态信号的处理方式信号集未决信号集和阻塞信号集信号的编号信号4要素Linux常规信号说明(1-31)信号的产生终端按键产生信号硬件异常产生信号kill函数/命令产生信号软件条件产生信号信号集操作函数编辑信号集设定sigprocmask函数sigpending函数信号捕捉signal函数sigaction函数信号捕捉特性信号捕捉函数案例内..
2022-08-16 19:14:59 4106 1
原创 C++项目实战-多进程(一篇文章)
程序和进程的基本概念单道程序设计和多道程序设计并行和并发进程控制块PCB进程常用的命令环境变量环境变量操作函数
2022-08-14 17:49:40 11643 2
windows10/11 + ubuntu16.04 + vscode开发环境配置安装
2023-10-27
如何才能把数据结构和算法学通透了?
2021-12-17
TA创建的收藏夹 TA关注的收藏夹
TA关注的人