C语言
文章平均质量分 79
Fireplusplus
前深信服员工,前鹅厂员工
展开
-
TCP shutdown 之后~
通过 shutdown() 关闭读写操作,会发生什么?具体点呢,考虑两个场景:原创 2024-08-18 12:36:14 · 819 阅读 · 0 评论 -
UDP connect 内核源码分析
有多少人看过 udp 的 connect 实现。。原创 2024-07-28 23:36:42 · 835 阅读 · 0 评论 -
DH群密钥交换算法
超简单的安全密钥交换算法~原创 2024-01-03 15:15:29 · 1162 阅读 · 0 评论 -
零拷贝技术-内核源码剖析
小师妹说零拷贝就是快~原创 2023-03-05 11:37:38 · 453 阅读 · 0 评论 -
TCP伪装
给UDP穿个外套吧原创 2022-12-04 12:23:35 · 1705 阅读 · 0 评论 -
从malloc到内存管理
malloc是谁?malloc是怎么分配内存的?malloc分配的是什么内存?原创 2021-07-25 23:03:03 · 416 阅读 · 0 评论 -
数据安全与虚拟网卡的应用(三)
墨迹了大半年,终于把这个玩意墨迹的差不多了。整体的结构跟当初设计的还是有一些偏差的,一部分原因是因为懒,另一部分原因是没人关注没动力,随便搞搞吧。原创 2021-06-19 13:08:39 · 295 阅读 · 0 评论 -
数据安全与虚拟网卡的应用(二)
上次写到我们打开了一个虚拟网卡,得到的其实是一个文件描述符。考虑到我们后面还会有其它的文件描述符需要统一管理,为了方便,我们得提前实现好管理描述符的逻辑。Let‘s do it !原创 2021-04-24 17:49:56 · 256 阅读 · 0 评论 -
数据安全与虚拟网卡的应用
最近逛github偶然发现了自己之前写的一段创建tun网卡的c代码,才发现它孤零零的在那儿躺了很久,想着怎么不让它继续孤单下去,于是就有了现在这篇文章:30天用c实现一个代理,也算物尽其用了吧。原创 2021-01-31 23:24:30 · 421 阅读 · 0 评论 -
linux下的动态库注入
前言最近在维护公司的一个服务X,服务X因为协议设计的不够安全,存在被攻击的风险,所以修改协议提升安全性就显得势在必行了。然鹅,该项目涉及到多个版本,将改动合入到各个版本引起的开发及测试工作量颇大,最终讨论后决定通过动态库注入的方式进行修改。何为动态库注入动态库注入是指在程序启动或运行的时候,通过某种手段加载另一套接口库,替换原有依赖库中的函数。这样可以达到改变程序功能而又不对原有代码进行修改的目的。如何做linux下有一个环境变量叫LD_PRELOAD,动态链接器在载入一个程序所需的所有原创 2020-10-14 23:13:56 · 1891 阅读 · 2 评论 -
centos下创建虚拟网卡
虚拟网卡Tun/Tap较高版本的linux大都自带了tun/tap 驱动程序用以实现虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装。利用tun/tap 驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链路中。Tun/Tap驱动程序工作原理做为虚拟网卡驱...原创 2020-01-01 13:08:48 · 2851 阅读 · 1 评论 -
用C语言实现Ping命令
【引言】前几天脑子里忽然蹦出来一个想法,想试着用C语言写一个自己的Ping命令出来。开始还有些茫然无措,因为此前没有接触过网络编程方面的知识。幸运的是对Ping的实现原理还是比较清楚的,难度和挑战皆在于网络编程方面的零基础,再加上现在的课程比较多,所以只能每天抽出一部分时间来学习所需的网络编程知识。大概会持续个两三周。既然如此,索性开个博客,记录下整个学习的过程,也算是每天的总结了吧。原创 2016-06-03 11:21:05 · 45613 阅读 · 13 评论 -
最简单的server/client程序
编写了一个最简单的server/client聊天工具练练手:server.c 的作用用是接受client的请求,并与client进行行简单的数据通信,整体为一一个阻塞式的网网络聊天工工具。server.c:#include #include #include #include #include #include #include #include const shor原创 2016-07-24 22:51:43 · 2705 阅读 · 0 评论 -
vfork死循环问题
关于vfork函数的一个问题。#include #include #include #include int main(){ int g_val = 100; pid_t id = vfork(); if (id == 0) { g_val++; printf("child runing first...%d:%p\n", g_val, &g_val); sle原创 2016-08-27 14:58:45 · 1012 阅读 · 0 评论 -
gdb在汇编指令级调试程序
方法很多,掌握一种就好:(前提:编译时加 -g 选项)在gdb调试界面输入命令:display /ni $pc 在每行源程序后面显示n行汇编指令(n换成想要的显示的行数,如display /3i $pc)调试方法:之前程序级中调试的下一步 n 对应 现在的 ni,之前的 s 对应现在的 si,其余指令不变。原理:display每执行一条语句打印对应寄存器或变量的值;/ni 将机原创 2016-06-11 09:38:33 · 1270 阅读 · 0 评论 -
C++指针与引用
引言C++中的指针沿用自C语言,这没有什么可说的。C语言中并没有引用这个概念,那么为什么C++中要引入这么一个概念呢?存在必有其道理,还是先来分析一下这两者的区别吧。指针提起指针那可是C语言中的一把大宝剑,进可杀人,退可伤己。它用法也是多种多样,比如:一个简单的交换函数void Swap(int a, int b){ int tmp = a; a =原创 2016-05-22 17:08:37 · 804 阅读 · 0 评论 -
extern "C" 用法解析
文/JasonDing(简书作者)原文链接:http://www.jianshu.com/p/5d2eeeb93590引言C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。extern "C"的主要作用就是为了能够正确实现C++代码调用转载 2016-05-23 14:07:32 · 1615 阅读 · 0 评论 -
malloc/calloc/realloc/free与new/delete对比
C动态申请内存函数:函数原型:void *malloc(size_t size);函数功能:申请size个字节的内存空间,返回该段空间的首地址,该空间里面的东西是随机值。返回值:始终是void*,申请成功,返回空间的首地址,否则返回NULL,所以使用这个函数一定要对返回值进行判断。函数原型:void *calloc(size_t num, size_t size);函数原创 2016-06-02 19:41:41 · 742 阅读 · 0 评论 -
【Linux】阻塞信号
LInux中信号产生的原因大致有一下三种:键盘中断命令发出异常产生中断但归根结底,这些信号其实都是最终有操作系统发出的。常见的对信号的处理,无外乎以下三种:忽略终止该进程自定义行为对信号的处理动作叫做信号递达,在信号由产生到递达的过程中还有一种状态叫做未决。即信号虽产生,但是未被处理。这个时候就需要将信号保存起来。信号的种类: 其中,前31原创 2016-07-09 22:29:26 · 650 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目:统计一个数字下排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。当然第一眼就能想到遍历这个数组然后统计这个数组中某个数字出现的次数。当然第一眼就能想到的方法通常来说效率都不怎么样再稍微想一下这个题目,是一个已序的数组,所以呢,不难想到二分查找。我们可以先用二分查找找到一个3,这个3的左右两边有可能还有3,所原创 2016-05-20 23:07:21 · 1575 阅读 · 0 评论 -
C实现一个进度条
平常是否做过一些小项目需要耗费一定的时间?看着别人的软件上的进度条着实有些羡慕,不放来实现一个简单的进度条吧!我们需要将【】左右中括号“固定”在屏幕的两边,然后依次用“=”将它填满,是从左向右的。初步编写代码如下:#include void ProgressBar(){ char arr[102] = {'\0'}; int n = 100, i = 0; while (i原创 2016-06-07 14:23:44 · 1458 阅读 · 3 评论 -
反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表结点定义如下:typedef struct ListNode{ int val; struct ListNode *p_next;}NODE, *PNODE;为了能够思路清晰地反转链表,我们通过图示的方法来分析一下具体的步骤:假设现在已经有了这样一个链表:原创 2016-05-09 16:25:43 · 775 阅读 · 0 评论 -
杨氏矩阵中的查找
给定一个杨氏矩阵,如何快速查找指定的元素?要讲究技巧。首先弄清楚什么叫做杨氏矩阵:它的每一行从左至右是递增的,每一列从上至下是递减的。例如:1, 2, 32, 4, 65, 7, 8对于这道题,首先想到的当然是暴力方法了,两层for循环嵌套查找,在优化一下每次从每行的最后一个元素开始比较,要是大于这个地方的值,那么肯定不在这一行了,于是相当于删除了一行。当然还有更好的方原创 2016-04-23 18:56:45 · 470 阅读 · 0 评论 -
链表中倒数第k个结点
题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人都习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1, 2, 3, 4, 5, 6。这个链表的倒数第3个结点是值为4的结点。链表结点定义如下:typedef struct ListNode{ int val; struct ListNode *p_next;}NOD原创 2016-05-08 10:41:21 · 800 阅读 · 0 评论 -
C/C++struct与C++struct/class关键字详解
C/C++中的structC中的struct只是一个简单单单结构体,其中只能声明变量,而不能声明函数,而C++中的struct中却可以有函数。C++中struct成员默认访问权限为public,这是为了兼容C。在C中没有访问权限这一说。C++中的struct/class1。 字面上的区别在字面上struct是structure的缩写,通常叫做“结构体”,在C语言里用于将原创 2016-05-31 11:51:28 · 1978 阅读 · 0 评论 -
C/C++中extern关键字详解
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而转载 2016-05-31 11:13:55 · 336 阅读 · 0 评论 -
C/C++中const关键字详解
为什么使用const?采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替),分类如下: 常变量: const 类型说明符 变量名 常引用: const 类型说明符 &引用名 常对象: 类名 const 对象名 常成员函数: 类名::fun(转载 2016-05-31 11:12:13 · 325 阅读 · 0 评论 -
C/C++中static关键字详解
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。用法1:函数内部声明的static变量,可作为对象间的一种通信机制 如果一局部变量被声明为static,那么将只有唯一的一个静态分配的对象,它被用于在该函数的所有调用中表示这个变量。这个对象将只在转载 2016-05-31 11:00:36 · 450 阅读 · 0 评论 -
C语言 FILE结构体
C语言的stdio.h头文件中,定义了用于文件操作的结构体FILE。这样,我们通过fopen返回一个文件指针(指向FILE结构体的指针)来进行文件操作。#ifndef _FILE_DEFINEDstruct _iobuf { char *_ptr; //文件输入的下一个位置 int _cnt; //当前缓冲区的相对位置 char *_base; //指基础位置(即是原创 2016-08-27 15:16:23 · 2437 阅读 · 0 评论 -
进程等待
为什么需要进程等待?一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或者waitpid获取这些信息,然后彻底清除掉这个进程,当它终止是Shell调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。当原创 2016-08-28 13:15:12 · 1033 阅读 · 0 评论 -
进程程序替换
进程程序替换用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换(也仅仅替换代码和数据,其它不变),从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。其实有六种以exec开头的函数,统称exe原创 2016-08-28 13:39:31 · 622 阅读 · 0 评论 -
IO多路转接之epoll
#include #include #include #include #include #include #include #include #include int start_up(char* ip, short port){ int listen_sock = socket(AF_INET, SOCK_STREAM, 0); if (listen_sock < 0原创 2016-09-27 13:40:48 · 518 阅读 · 0 评论 -
漫谈-线程
线程概念我们都知道,进程拥有独立的地址空间,进程之间共享数据需要通过进程间通信机制来实现。然而进程是单一执行流的,有些时候需要在同一个进程中执行多个控制流程,这时候线程就派上了用场。比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一个“等待-处理”的循环,可以用多线程实原创 2016-09-10 13:04:24 · 430 阅读 · 1 评论 -
进程内存印象
Linux下C程序生成主要由四个步骤组成:预编译、编译、汇编、链接。编译器gcc经过 预编译、编译、汇编3个步骤将源程序文件转换成目标文件。如果程序有多个目标文件或程序中使用了库函数,则编译器还需要将所有目标文件及所需的库文件链接起来,最后生成可执行程序。当程序执行时,操作系统将可执行程序复制到内存中,程序转为进程通常需要以下步骤: *内核将程序读入内存,为程序分配内存空间;原创 2016-08-25 19:59:34 · 625 阅读 · 0 评论 -
Linux信号通识
何为信号信号是操作系统提供的一种向进程通知发生了某种特定事件的机制。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。直接看概念可能还是很模糊,所以从最简单的例子开始:用户输入命令,在Shell下启动一个前台进程用户按下Ctrl-C,这个键盘输入产生一个硬件中断如果CPU当前正在执行这个原创 2016-09-03 13:57:19 · 666 阅读 · 0 评论 -
进程间通信之共享内存
何为共享内存共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共原创 2016-09-02 14:47:30 · 2038 阅读 · 0 评论 -
进程间通信之信号量
何为信号量信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。对信号量的操作当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用:大于0,资源可以请求,将信号量的值-1(P操作);等于0,无资源可用,进程会进原创 2016-09-02 13:58:17 · 4981 阅读 · 0 评论 -
strcpy()函数自实现
strcpy() 这个函数应该是每个人经常用到的了,今天,我们就自己来实现一下这个函数int main(void){ char arr1[20]; char arr2[] = "hello world!"; //char *arr2 = NULL; my_strcpy(arr1, arr2); printf("%s", arr1); system("pause"); ret原创 2016-03-31 21:31:26 · 501 阅读 · 0 评论 -
strlen()函数自实现
strlen()函数也是一个经常用到的函数,今天就来实现一下它。照例,依旧先构建整体框架:#include int main(){ char arr[] = "hello world !"; int len = my_strlen(arr); printf("%d\n", len); return 0;}下面就来具体实现了:第一种:int my_strl原创 2016-04-12 13:20:22 · 731 阅读 · 0 评论 -
strcmp()函数自实现
今天继续来模拟实现库函数------strcmp()。写my_str_cmp()函数之前,先了解一下它的定义:strcmpC/C++函数,比较两个字符串设这两个字符串为str1,str2,若str1==str2,则返回零;若str1>str2,则返回正数;若str1要说的是,str1 > str2 时返回一个正数就好,具体这个数字是几,是无所原创 2016-04-13 08:26:03 · 1247 阅读 · 0 评论