DHCP动态主机配置协议探究 DHCP的作用是为局域网中的每台计算机自动分配TCP/IP信息,包括IP地址、子网掩码、网关、以及DNS服务器等。一. DHCP基本介绍DHCP是BOOTP协议的进化版本,所以有时候用老版本的抓包软件显示DHCP的报文类型为bootp。 DHCP的报文用UDP方式封装的。 DHCP服务器侦听端口:67,DHCP客户端侦听端口:68,DHCP中继侦听端口:67。 DHCP地址分配方式:手工分配、自动分配(租期无限长)、动态分配(具有一定期限) 服务器为客户端分配IP的顺序:mac静态绑定、c.
realloc动态内存调整探究 1 关于动态内存C程序使用malloc、realloc等内存申请函数在堆上分配和释放内存的。程序在执行期间有两个内存区域,一个是内存区域是栈(stack),另一个是堆(heap)。栈中的空间分配给函数的参数和本地变量,执行完该函数后,存储的参数和本地变量的内存空间就会自动释放。在堆上分配的内存,在不需要的时候要用free释放空间,由程序员控制。使用realloc的好处:不需要预先分配存储空间,且可以按需扩大或缩小,有效的使用内存空间。使用realloc的坏处:会占用大量CPU资源。一般情况下
va_list可变参数理解(va_start/va_end...) 在工作中,一些可变参函数里总能看到va_start、va_end、vsnprintf、va_list等相关函数,甚是疑惑,到底是干啥的,有什么作用呢?va = variable argument先来简单介绍一下可变参数吧,先来看看最最熟悉的printf函数。int printf(const char *format, ...);这三个点点就是可变参数。好了,开始介绍va相关内容吧!1.作用VA_LIST是在C语言中解决变参问题的一组宏。有点绕,我的理解,如果你写代码过程中,需要对
c中结构体数据对齐问题 1.为什么需要数据对齐提升CPU读取数据的效率。CPU每次都是从以4字节(32位CPU)或是8字节(64位CPU)的整数倍的内存地址中读进数据的(例如32位的只能0x00000004、0x00000008这种地址一次读4字节的数据)。如果数据不对齐,例如一个int类型放在0x00000004、0x00000008这两个内存地址中间,CPU就会多次读取,如果把整形对齐存放在0x000000...
[笔记]linux C/C++ 获取精确时间方法 获取带毫秒的时间#include <time.h>#include <sys/time.h>//调用函数时候可以传入字符串进行区别和标记void sysUsecTime(const char *a){ struct timeval tv; struct timezone tz; struct tm *p; gettimeofda...
虚拟路由器冗余协议vrrp原理的理解 VRRP(VirtualRouterRedundancyProtocol)虚拟路由器冗余协议作用避免由于局域网网关单点故障而导致的网络中断,如下图,如果交换机与外网连接出现故障,则所有的pc都不能访问外部网络。解决方法在网络中增加两台路由器(或者三层交换机)部署vrrp,作为冗余的网关,如下图VRRP特点能让多台同属于一个广播域的网络设备能够协同工作,实...
Linux下socket编程:TCP连接 目录一、流程简述 服务器端 客户端二、概念及函数 1.套接字描述符 2.socket函数 3.bind函数 4.connect函数 5.listen函数 6.accept函数 7.close函数三、代码 服务端 客户端四、笔记 1.一个标准的三次握手抓包 2.小技巧:打印出connect过程的错误一...
生成树协议STP、RSTP和MSTP原理的理解 在组网中,很可能会出现环路或者称冗余链路,为避免形成广播风暴,需要一种方法来避免形成环路,并且在主链路故障中断时候,可以将冗余链路自动切换为转发状态,以恢复网络的连通性。生成树协议(STP、RSTP、MSTP)就可以实现这样的功能。STP(802.1D,SpanningTreeProtocol,生成树协议)基本思想将网络的拓扑修剪为树形拓扑,拓扑图形状与一棵树相似,这样就不会...
C语言define替换printf 问题:当我想要调试的时候,想直接printf输出打印当我将代码上设备的时候,希望输出log里(下图代码里cxtlog是输出到log的函数,这里不讲实现了)解决:设置一个CFG_DEBUG宏定义,定义了这个宏就使用printf,没有定义就输出log用#define来重定义用法:printf里的参数是可变长的,就需要用到变参宏定义,这是系统自带的。‘...’和'__VA_A...
c语言实现两个超大数的相加(超长数据) 这几天无聊,突然想起来,大学当时有个问题困扰着我两个超大的数怎么保存和相加呢,计算机的整形32位的最大也就4294967296,超过这个数就计算不了了哇然后就想动手实践一下思路:1.超长数据怎么存呢。脑子一拍,巨长的数肯定用字符数组来存哇,没毛病。2.要怎么运算呢。我想的是,一个数最大是4294967296,长度为10,那我两个9长度的数据相加,肯定不会超过1999999998...
sed命令替换指定字符后不固定字符串,文本信息的替换删除 sed主要用来处理文本内容的修改,文本的提取分割可以使用awk和cut命令,参考本人文章linux常用文本字符分割分析awk和cut命令sed命令格式:sed [选项] '.../.../...'[输入文件]...'参数1/.../参数2' 这个和vi里命令行模式的输入格式很像,比如替换文本/s/root/aaa/g常用选项:-n 仅显示处理的行-i 直接对原文件进行修改...
C语言extern关键字用法和理解 extern表明变量或者函数是定义在其他其他文件中的例如:extern int a;显式的说明了a的存储空间是在程序的其他地方分配的,在文件中其他位置或者其他文件中寻找a这个变量。用法一个c文件需要调用另一个c文件里的变量或者函数,而不能从.h文件中调用变量。详见下文1 extern int a = 5与int a = 5意义是一样的,都是定义。而extern int a;......
Linux下C程序执行shell命令并获取返回结果的方法 Linux下的C编程有以下几种方法可以执行shell命令system()函数 exec函数簇 popen()函数如果还需要获取返回结果,有两种较简单方便的方法popen()函数 匿名管道1.system()函数所需头文件:#include<stdlib.h>函数原型:int system(const char *cmdstring); ...
Linux消息队列编程(简单应用) 消息队列,Unix的通信机制之一,可以理解为是一个存放消息(数据)容器。将消息写入消息队列,然后再从消息队列中取消息,一般来说是先进先出的顺序。可以解决两个进程的读写速度不同(处理数据速度不同),系统耦合等问题,而且消息队列里的消息哪怕进程崩溃了也不会消失。 最简单的消息内存的使用流程①ftok函数生成键值②msgget函数创建消息队列③msgsnd函数往消息队列发送消息④...
Linux下共享内存编程(共享存储空间) 共享存储允许两个或多个进程共享一个给定的存储区,是进程间通信最快的一种方式。不要同时对共享存储空间进行写操作,通常,信号量用于同步共享存储访问。最简单的共享内存的使用流程①ftok函数生成键值②shmget函数创建共享内存空间③shmat函数获取第一个可用共享内存空间的地址④shmdt函数进行分离(对共享存储段操作结束时的步骤,并不是从系统中删除共享内存和结构)⑤shm...
Linux时间与系统时间相差8小时的解决办法 原因是时区不同在/etc/profile文件中增加一行 export TZ='CST-8'使文件立即生效source /etc/profile 或者 . /etc/profile
Linux编程三种常用线程同步 本文介绍三种常用的线程同步方法,互斥量、条件变量、信号量共同需要的头文件为#include<pthread.h>互斥量强调资源访问互斥条件变量是通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足信号量强调线程间同步一、互斥量(mutex)互斥量在同一时间只有一个线程能访问,任何其他试图再次对互斥量加锁的线程都会被阻塞直到当前线程释放该互斥锁。在Linux下,线程的互斥量数...
Linux编程常用alarm定时器 写程序时经常有让程序运行几秒后退出这种需求,就需要用到定时器,个人常用的是alarm定时器,方便好用。 函数原型unsigned int alarm(unsigned int seconds);seconds为指定秒数 所需头文件#include<unistd.h> 一个进程只能使用一个alarm闹钟,有多个alarm闹钟时,闹钟时间会更新为最后一个定时器所指定的秒数时间。alarm(...