
c/c++
工农村贴膜小哥
最喜欢贴膜了
展开
-
选择模型--非阻塞套接字详解
0x01什么是选择模型普通套接字编程,常常会遇到阻塞主进程,比如recv,read等,如果没有数据发过来会一直等待。有没有办法让进程等待一段时间,再退出呢。这时候使用选择模型就能解决这个问题。原理–I/O多路复用:通过一个fd_set集合来管理套接字,当某个socket可读或者可写的时候,它可以给你一 个通知。这样配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行re...原创 2018-11-06 22:10:42 · 508 阅读 · 0 评论 -
编写web服务器来理解HTTP协议
前言先说说弄了个什么,访问web服务的80端口,简单的web服务器解析http协议后,发送当前目录的index.html给浏览器,输入xxx,服务器回应hello word:xxx。GET 请求敲击127.0.0.1 会默认访问本机的80端口。服务器得到的数据如下第一行 GET / HTTP/1.1 表示get请求,使用1.1版本,中间的 / 为get所带的参数,比如 G...原创 2019-05-12 15:58:22 · 299 阅读 · 0 评论 -
make--(3)makefile
文件名宏继上篇,文件名宏还可以添加后缀:后缀解释R去掉扩展名D去掉文件名和扩展名F去掉前面的目录B去掉前面的目录和扩展名在当前环境下,我的命令行在G:make\路径下,所以下面的测试中$@为.\test.exe。test.exe:test.obj gcc -o test.exe test.obj echo $@ ...原创 2019-01-09 22:00:34 · 388 阅读 · 0 评论 -
make--(1)编译流程
前言现在的IDE很成熟了,但掌握底层的编译仍然很重要。c的编译流程分成四个部分1预处理(Preprocessing), 2.编译(Compilation), 3.汇编(Assemble), 4.链接(Linking)。本篇主要验证windows环境下的4个流程。准备首先下载一个编译器,你可以选择用VS自带的cl,我这里使用的是GCC。下载地址:MINGW下载之后,一直继续,选择要安装...原创 2019-01-06 22:00:37 · 782 阅读 · 0 评论 -
make--(2) makefile
nmake当你的程序只有一个源文件时,直接就可以用gcc命令编译它。但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,就会很麻烦,所以需要make工具来进行批处理编译。make工具的使用主要是编写makefile,用来描述make该如何进行编译。make有许多种类,这里用vc++的nmakenmake环境nmake在安装的vc++目录中,我的在D:\study\vs 2015\VC...原创 2019-01-06 22:00:00 · 858 阅读 · 1 评论 -
理解多线程(四)--原子量和原子操作
原子量互斥量可以对于共享变量的访问进行加锁,可以保证对临界区的互斥访问,但加锁总是繁琐的,所以提供了更简单的共享变量保护访问的操作,原子量和原子操作。原子量的构造原子量包含在#include 中,对于基本类型,我们可以这样定义原子变量 std::atomic_bool abool; std::atomic_int aint; ...原创 2018-12-25 22:13:55 · 564 阅读 · 0 评论 -
理解多线程(三)--互斥量
std::mutexmutex就是互斥量的意思,在c++中使用互斥量需要包含#include引入互斥量之前了解了线程访问公有数据是不安全的,所以使用互斥量来防治线程不安全的操作。互斥量就是一个变量,只有两种状态,加锁和解锁。每一个互斥量管理一个公有数据,一个线程访问公有数据后,互斥量加锁,其他线程就不能访问,等待之前的线程访问完成解锁后,才能访问。mutex分类Mutex 系列类(四种...原创 2018-12-09 17:46:34 · 457 阅读 · 0 评论 -
理解多线程(二)
前言上篇已经讲到,线程间的同步,和线程访问公用数据安全是存在问题的。这篇主要理解C++11标准上处理这些问题的方法。std::threadc++通过std:thread操作线程,因此使用 std::thread 时需要包含 #include 头文件。构造函数thread();//默认构造函数,没有执行的实例对象thread (fun,_1,_2,...)//初始化构造函数,有执行的实例...原创 2018-12-09 16:07:00 · 257 阅读 · 0 评论 -
你可能学了个假c语言系列
前言最近朋友给我发了些反人类的程序,有点慌,感觉自己学的是假的c语言,所以找了最近遇到的几个c语言细节(坑爹)的地方分享给大家。答案知识点会在后面给上。反猿猴题目==0x1输出结果是什么??typedef struct test{ int t;}test;int main(){ int buff[sizeof((test *)0)->t]; printf("%d", s...原创 2018-12-06 00:27:32 · 370 阅读 · 0 评论 -
理解多线程(一)
引入并发概念单道操作系统其实在单道系统时期,是没有并发的,cpu更是没有多核。程序员输入数据,计算机处理,计算机输出结果,每次一个程序执行完才能执行其他程序。但不久聪明的程序员们发现这样极大的浪费计算机资源。比如,在执行一个算术问题时候,程序员输入数据是很慢的(scanf())。而这几秒钟cpu却阻塞在这里等待IO完成。多道操作系统所以,为了克服单道系统的各种问题。研究出了多道操作系统,让...原创 2018-12-08 16:40:03 · 247 阅读 · 0 评论 -
杂记--帮我哥戒网瘾的恶意程序
前记每次回去,都能看见我哥在玩08年的DNF,20来岁的人了,沉迷游戏无法自拔,我想让他做点有意义的事,怎么办呢。直接把游戏卸载了?或是把角色全删了?不行,我估计会被他200斤的重拳锤死。这时候就需要我们程序员的聪明才智了。实现原理我先试了下打开DNF,发现会先启动一个Client.exe的启动程序。灵光一闪。1–我可以写个程序,监听Client.exe启动,如果启动了就给他关闭。2–当...原创 2018-11-18 21:59:59 · 2187 阅读 · 1 评论 -
C--十六进制整形和字符串的相互转换
前言十六进制整形:6B746d656d6f7869616667650007e26B十进制字符串:“ktiemoxiaoge ‘\07’ '\226’k"十六进制字符串“6B746d656d6f7869616667650007e26B”有什么用呢??在网络通信中,常常要制定一定的通讯格式。比如我制定,我要发送16字节的数据,其中前缀和后缀都是一字节为6B,中间为12字节的发送者姓名,加上两...原创 2018-11-15 22:38:43 · 5117 阅读 · 1 评论 -
c可变参数详解
前言最近翻到今年前自己写的hello word 的劣质代码。突然看见printf,这个可变参数的函数。而平时所编写的都是固定参数。所以今天一步步德了解下可变参数函数的实现原理。编写一个自己写的printf()函数。需要了解的函数参数1.可以通过…三个点表示可变参数2.函数的参数是通过栈进行 。栈是由高到低来存储,而且是从右往左读入。函数传递过程就是压栈的过程。如test(int a,in...原创 2018-11-11 21:20:11 · 2033 阅读 · 0 评论 -
c的注册和回调浅谈
注册回调的作用在设计模式中注册回调的方式叫做回调模式。在SDK开发中,为增强开发者的SDK通用性,排序或者一些算法逻辑需要使用者进行编写。这时候就需要向SDK传递回调函数。注册回调的流程SDK的接口会提供一个注册回调函数,来规范回调函数的格式,如返回值,参数等。使用者编写一个固定格式的回调函数,来调用SDK提供的注册回调函数。当然,在c++中注册回调的实现方式是通过函数指针。栗子栗子...原创 2018-10-21 20:19:08 · 3935 阅读 · 0 评论 -
一个简单的libevent网络库封装
前言本文不会讲libevent如何使用,只提供一个简单的c++ libevent 封装。封装的功能提供网络连接事件,网络断开事件,读数据事件,使用时候重载该虚函数即可。提供定时器功能,定时向连接的客户端发送数据。主要逻辑1,libeventSer—该类是网络服务的主体,对外提供StartListen(int Port);和AddTimerEvent()两个接口,使用时候继承改类,重...原创 2019-06-19 20:51:46 · 946 阅读 · 0 评论