自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 在CentOs下使用git连接github

在CentOs下连接github并使用git维护代码创建SSH key作者使用的是SSH key方式来建立连接。~/.sshssh-keygen -t rsa -C "xxxx@qq.com"出现Enter file in which to save the key (/root/.ssh/id_rsa)直接回车表示生成在本目录下出现Enter passphrase (empty for no passphrase)输入确认密码,之后使用这个密钥填现在创建的密码即可创建好了以后出现l

2021-09-08 13:57:50 742

原创 MIT 6.828 LAB1

MIT 6.828 LAB1(未完)首先clone代码下来需要安装一些工具链。克隆代码:git clone https://pdos.csail.mit.edu/6.828/2018/jos.git lab编译工具链是一个工具集包括c编译器,汇编编译器,连接器。在命令行下执行gcc -m32 -print-libgcc-file-name,如果输出/usr/lib/gcc/i486-linux-gnu/version/libgcc.a 或 /usr/lib/gcc/x86_64-linux-gn

2021-09-01 14:03:12 240

原创 编写服务器程序遇到的问题汇总

谈一些这些天编写服务器程序遇到的问题汇总(服务器基于游双书上代码实现):游双书上代码中的几处问题1.大文件处理。原代码中并虽然对文件的属性进行了获取,但只是为了判断文件是否可读,并没有对文件的大小进行获取。原代码中在写操作时设置了一个int bytes_to_send但是没有将文件的尺寸加入其中,这样就导致每次写入时,如果 文件的大小+报头的大小 大于sock写缓冲区大小的话,就只会写入一次,并且bytes_to_send也会清零。修改方法:在获取文件属性,将size和报头的长度都记录

2021-07-14 14:05:35 667 5

原创 在web服务器中加入定时器

在web服务器中加入定时器定时器主要结构:client_data结构体:记录客户端链接信息,以及每个客户端连接时的时间参数,主要记录超时时间等util_timer类:记录timer里的一些数据,如回调函数,超时时间以及文件描述符等sort_timer_lst类:有序链表,记录timer位置,按照超时时间(记录的绝对时间)从小到大,这样在处理的时候,只要遇到不超时的就可以结束循环,不用全部遍历。执行流程:首先是直接使用alarm(5);在5秒钟之后触发SIGALRM信号该信号会调用与其绑定的信号

2021-07-10 10:12:11 759

原创 实现游双《linux高性能服务器》书上代码碰到的一些问题(大文件传输)

实现游双《linux高性能服务器》书上代码碰到的一些问题第一个:网站的根目录,在代码中应该写绝对路径才行。第二个:调试问题,由于没有日志系统,有很多输入错误但是没被编译器察觉的错误很容易发现不了。这个时候应该使用GBD进行多线程调试,配合printf或者打日志的办法定位到问题点,进行修改!第三个:这个代码中跑起来实测不能进行大文件的传输,源代码问题如下:问题在于bytes_to_send 和bytes_have_send记录文件传输进度的两个int变量的值未记录下需要传输文件的大小,传输文件完毕的判

2021-07-09 10:26:49 1304 3

原创 游双《linux高性能服务器》webserver源码

有限状态机解析http请求http_conn对象记录每一个链接的状态epoll + 半同步半反应堆线程池并发处理连接locker.h//线程同步机制包装类#ifndef LOCKER_H#define LOCKER_H#include <exception>#include <pthread.h>#include <semaphore.h>//封装信号量的类class sem{public: sem() { i

2021-07-06 13:34:26 2230

原创 mmap函数和munmap函数

mmap函数和munmap函数mmap函数用于申请一段内存空间,我们可以将这段内存作为进程间通信的共享内存,也可以将文件直接映射到其中。munmap函数则用于释放有mmap创建的这段内存空间。他们的定义如下:#inlcude<sys/mann.h>void mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);int munmap(void *start, size_t length);/

2021-07-03 03:48:25 3013 1

原创 定时器处理非活动连接

服务器编程中使用定时器处理非活动连接主要结构:client_data结构体:记录客户端链接信息,以及每个客户端连接时的时间参数,主要记录超时时间等util_timer类:记录timer里的一些数据,如回调函数,超时时间以及文件描述符等sort_timer_lst类:有序链表,记录timer位置,按照超时时间(记录的绝对时间)从小到大,这样在处理的时候,只要遇到不超时的就可以结束循环,不用全部遍历。执行流程:首先是直接使用alarm(5);在5秒钟之后触发SIGALRM信号该信号会调用与其绑定的

2021-07-01 11:34:34 400

原创 使用状态机完成对HTTP请求的读取和分析

使用状态机完成对HTTP请求的读取和分析主状态机作用(parse_content()):读取请求行与头部行数据状态:请求行、头部行从状态机作用(parse_line):读取每一行数据状态:读取成功、失败、需要继续读取parse_request():读取请求行,并将主状态机状态更改为头部行parse_header():读取头部行主状态机初始状态为请求行,循环调用parse_line,若为成功状态继续(失败退出返回失败原因)并且判断主状态机状态请求->parse_request()-&

2021-06-30 10:52:32 1255 1

原创 智能指针auto,unique&shared

智能指针当我们使用指针在堆上分配空间时,大部分人的做法都是指针完成任务的时候使用delete操作符进行释放。但是总有意外产生。void remodel(std::string str){ std::string * ps = new std::string(str); ... if(weird_thing()) { throw exception(); } str = *ps; delete ps; return ;}当上述代码出现异常时,delete将不被执行,因此也会导致内

2021-06-29 11:20:40 314

原创 一个简单线程池的编写

线程池定义一个简单的线程池,主要结构包括两个,一个是任务,一个是线程池。任务池中维护者线程队列和任务数组,线程队列中的子线程会循环从任务数组中提取任务,任务的添加和线程的消费是一对生产者和消费者,在任务满了和不足的时候需要用条件变量锁定,停止添加任务和取出任务。以下是结构体```cpptypedef struct { void *(*function)(void *); /* 函数指针,回调函数 */ void *arg;

2021-06-29 05:17:09 361

原创 EPOLL反应堆和LT/ET模式

EPOLL学习EPOLL的一些杂谈1.EPOLL反应堆反应堆Reactor模式:他要求主线程只负责监听文件描述符上是否有事件发生,有的话就立刻通知工作线程。除此之外主线程不做其他任何实质上的操作。读写数据接收新的连接,以及处理客户请求均在工作线程完成。使用同步I/O流程实现的Reactor:1.主线程往epoll内核时间注册socket上的读就绪事件。2.主线程调用epoll_wait等待socket上有数据可以读。3.当socker上有数据可以读时,epoll_wait通知主线程。主线程将so

2021-06-28 00:26:38 179

原创 使用POLL/EPOLL实现简单的服务端sock程序

使用EPOLL实现简单的服务端sock程序//使用epoll模型开发服务端流程#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h> #include <unistd.h>#include <arpa/inet

2021-06-27 00:35:20 240

原创 使用select API实现的sock服务端

使用select实现一个io复用的sock服务端#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h> #include <unistd.h>#include <arpa/inet.h>#include &

2021-06-26 00:21:28 138

原创 服务器端socket程序的多进程,多线程版

客户端socket程序的多进程,多线程版```cpp//多进程版本的服务器//每次接受链接时,创建一个子进程来维护链接,链接结束时,给主进程发送信号来回收子进程#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <unistd.h>#include <arpa/inet.h>#include &

2021-06-24 20:12:54 133

原创 linux读取命令行参数

linux使用程序读取命令行参数/*选项数组的定义: 结构体option:系统已定义,直接使用即可 struct option { //选项长名称 const char* name; //该选项是否具有附加参数;0:无 1:有 2:可选 int has_arg; //指向整数,用于保存val值,设为0 int * flag //选项短名称 int val } 函数getopt_long()函数原型:int getopt_long(int argc,cha

2021-04-04 08:29:34 840

原创 QT 800行代码实现的几乎全功能扫雷

继上次写完控制台扫雷之后,突发奇想,决定好好实现扫雷这个小游戏,于是花两天学了下QT,优化了两天写了一个QT版扫雷!源代码和打包好的window程序地址:https://github.com/ChenDongyu-S/mineSweeping代码可能写的有点乱,见谅!但是尽量多的打了注释。先放部分游戏截图初始画面:在开始里面有三个选项选项是可以选择默认难度和自定义难度的,默认初级难度,点击应用更新到地图,不关闭选项窗口,点击确认,更新到地图,关闭选项窗口;窗口设置成模态窗口点击一个数

2021-03-29 08:37:36 934 3

原创 C++ 控制台扫雷

C++ 控制台扫雷花了一下午写出来的控制台扫雷,主要通过修改和打印数组来实现。主要的问题点:1.在显示地图的过程中,既要显示数字,又要显示雷和符号,所以的用string类型的二维向量,vector<vector<string.>>;中间要利用ASCII码将int型的数字转化为字符串。2.生成地图的时候,雷是随机的,我这里采用的做法是取余生成雷,举个例子,如果雷数是格子数的十分之一,那我遍历整个二维数组,在rand()%8 == 0时放置一颗雷,当放置10颗之后停止,这样可能会

2021-03-25 17:22:52 315

原创 leetcode 8. 字符串转换整数 (atoi)

leetcode 8. 字符串转换整数 (atoi)题目:请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被

2021-03-02 19:33:00 149

空空如也

空空如也

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

TA关注的人

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