- 博客(30)
- 收藏
- 关注
原创 I/O复用select,poll,epoll简单区别比较
select,poll,epoll都是IO多路复用的机制。 I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责...
2018-04-30 20:15:01 268
原创 tcp抓包——tcpdump
在Linux中Linux tcpdump是最重要的技术之一了解Linux tcpdump的表达式、Linux tcpdump的输出结果等方面是很必要的。tcpdump采用命令行方式它的命令格式为:tcpdump[-adeflnNOpqStvx][-c数量][-F 文件名][-i网络接口][-r文件名][-ssnaplen][-T类型][-w文件名][表达式]Linux tcpdump的选项介绍-a...
2018-04-29 22:17:00 261
原创 socket错误处理函数的封装
为使主程序具有可读性,将socket相关的系统函数的错误处理封装成一个wrap.cwrap.c#include <stdlib.h>#include <errno.h>#include <sys/socket.h>/* 打印错误原因并退出 */void perr_exit(const char *s){ perror(s); exit(...
2018-04-25 14:43:47 452
原创 网络字节序以及大小端
内存中的多字节数据相对于内存地址有大端和小段之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端和小端之分,网络数据流同样有大端小端之分,那么如何定义网络数据流的地址呢?发送主机通常将发送缓存区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接受缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址...
2018-04-23 20:41:45 364
原创 仿函数
仿函数:仿函数又名函数对象: 1、调用者:可以像函数一样被调用; 2、被调用者:以对象所定义的function call operator扮演函数的实质角色仿函数的主要作用:以tempplate参数指定你要采取的策略。以sort()为例,其第一个版本是以operator < 为排序时的元素位置调整依据,第二个版本则允许用户指定任何“操作”,务求排序后的两两相邻元素都能操作结果为t...
2018-04-22 18:20:33 451
原创 Linux压缩与解压缩
一、zip格式zip可能是目前使用得最多的文档压缩格式。它最大的优点就是在不同的操作系统平台,比如Linux, Windows以及Mac OS,上使用。缺点就是支持的压缩率不是很高,而tar.gz和tar.gz2在压缩率方面做得非常好。我们可以使用下列的命令压缩一个目录:# zip -r archive_name.zip directory_to_compress下面是如果解压一个zip文档:# ...
2018-04-16 20:20:59 173
原创 区别TCP和UDP
TCP:面向连接 传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 UDP:面向无连接 用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能...
2018-04-15 17:01:24 169
原创 Select技术
Select是一种多路复用IO输入输出模式,在linux的输入输出编程中也可以用到Select技术,通过Select的轮询机制,发现可用、可读或可写的接口,套接字也是一种输入输出机制,所以也可以使用Select方式进行高性能的网络程序设计。Select技术简介Select()函数是一种重要的socket编程机制,与传统的编程方法不同,它是用在非阻塞方式的网络应用程序中,顾名思义,非阻塞方式是函数调...
2018-04-13 20:21:34 309
原创 String的用法
string类声明string类本不是STL的容器,但是它与STL容器有着很多相似的操作,因此,把string放在这里一起进行介绍。 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下的需要。我们尽可以把它看成是C++的基本数据类型。 首先,为了在我们的程序...
2018-04-12 20:31:39 265
原创 vector的用法
vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。Vector的数据安排及操作方式与array非常相似,唯一的差别在于array是静态空间,一旦配置了就不能改变;vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。1、vector对象的定义及初始化vector<type> vec1; // v1保存类型为type的对象,默认构造函数,...
2018-04-11 21:00:47 209
原创 关于希尔排序
希尔排序的基本思想是:先将整个待排序列分割成若干子序列分别进行进行直接插入排序,等到整个待排序列基本有序时,再对全体记录依次进行直接插入排序。希尔排序也叫缩小增量排序,是1959年由D.L.Shell提出来的。希尔排序的具体实现方法和步骤:a、选择一个步长序列d1,d2,d3,...,dk,其中,di > dj,dk = 1;b、按步长序列个数K对序列进行K趟排序c、每趟排序,根据对应的步长...
2018-04-11 18:02:25 251
原创 用互斥锁和条件变量实现读写锁(读优先)
不久前发过一个版本,是写优先的,当时觉得读优先跟写优先差不多就没写读优先后来想了想,还是有必要写一写的,好处是可以更为清晰的区分读优先和写优先之间实现的细小区别更能加深印象吧。依旧头文件部分,my_pthread_rwlock.h,顺便纠正上篇中的一个错误pthread_rwlock.h——应为my_pthread_rwlock.h#pragma once #include<pth...
2018-04-11 17:52:37 516
原创 STL的六大组件
1、容器各种数据结构,用来存放数据,STL容器是一种class template。2、算法各种常用算法如sort,search,copy,erase等等,从实现的角度讲,STL算法是一种function template3、迭代器扮演容器和算法之间的胶合剂,是所谓的“泛型指针”,从实现的角度讲,迭代器是一种将operator*,operator ->,operator++,operator-...
2018-04-10 18:39:32 173
原创 TCP/IP协议那些事儿
TCP/IP不是一个协议,而是一个协议族的统称。里面包括IP协议、IMCP协议、TCP协议。TCP/IP分层:这里有几个需要注意的知识点:互联网地址:也就是IP地址,一般为网络号+子网号+主机号域名系统:通俗的来说,就是一个数据库,可以将主机名转换成IP地址RFC:TCP/IP协议的标准文档端口号:一个逻辑号码,IP包所带有的标记Socket:应用编程接口数据链路层的工作特性:为IP模块发送和接收...
2018-04-10 16:09:35 226
原创 Linux下进程间通信的手段及IPC函数命令
Linux下进程间通信的几种手段简介:1.管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;2.信 号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了 支持Unix早期信...
2018-04-08 18:24:35 442 1
原创 C++重载,覆盖,隐藏
一、重载简单来说,就是函数名相同,参数列表不同,即同名不同参,即可构成函数的重载。《高质量C++/C编程指南》列出了重载的特性: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual关键字可有可无。可以理解为重载的函数是两个不同的函数,在调用是,编译器会自动根据参数的情况调用其对应的函数如:#include<iostream...
2018-04-08 16:57:45 187
原创 数据结构关于哈夫曼树
给定n个权值作为n个叶子节点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的节点离根较近。要了解哈夫曼树,首先需要了解几个名词概念:1.节点路径长度:从树中一个节点到另一个节点之间的分支构成两个节点之间的路径,路径上的分支数目称作路径长度。2.树的路径长度:从树根到每一个节点的路径长度之和。...
2018-04-03 16:17:55 531
原创 关于读写锁以及用互斥锁和条件变量实现读写锁(写优先)
读写锁包括读取锁和写入锁,多个读线程可以同时访问共享数据;写线程必须等待所有读线程都释放锁以后,才能取得锁;同样的,读线程必须等待写线程释放锁后,才能取得锁;也就是说读写锁要确保的是如下互斥关系:可以同时读,但是读-写,写-写都是互斥的;明白这一点就很好做了。读写锁的分配规则:1.只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有该读写锁写锁用于读。2.仅当没有线程持有某个给定的的...
2018-04-01 21:09:31 2224
原创 互斥锁和条件变量~
互斥锁指代相互排斥,它是最基本的同步形式。互斥锁用于保护临界区,以保证任何时刻只有一个线程在执行其中的代码。如下lock_THE_MUtex(...)临界区unlock_the_mutex(...)互斥锁的上锁和解锁一般通过下列三个函数#include<pthread.h>int pthread_mutex_lock(pthread_mutex_t *mptr);int pth...
2018-03-30 20:53:01 262
原创 C和C++间的注释转换(改进版)
先吐槽下csdn,我的代码被吃了,重新发一遍,心累QAQ相比上篇,现在改进后的代码已经可以完全实现C和C++之间注释的转换了并对上篇的代码进行了一些改良 看起来更加直观一些注释转换的原理就不再赘述了相比于初版 自定义了一个ConvertComment.h的头文件 将函数声明部分放入其中 让代码看起来更具有可读性自定义头文件部分#ifndef _CONVERTCOMMENT_H#define _C...
2018-03-27 19:58:29 387
原创 linux下vim的配置及常用命令
VIM是从VI发展出来的一个Linux下的文本编辑器,相比于Vi,Vim可以完美兼容Vi,更在Vi的基础上增加了许多使用功能。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。1.Vim的三种模式:命令行模式,文本输入模式和末行模式。命令行模式 (command mode/一般模式) 任何时候,不管用户处于何种模式,只要按一下“Esc”键,即可使Vim进入命令行模式; 文本...
2018-03-24 21:37:08 335
原创 C和C++间的注释转换(初版)
这是初学时写的一个小的项目,当时代码弄丢了,今天找回来了,发出来代码是老早就写了最开始,没有经过更进一步的改进,仍然存在很多问题,但是对于一般的来说都是可以进行转换的首先是为什么要进行注释转换,大家都知道在C和C++中注释方式是不相同的,有时候需要将一些代码进行排版统一。而有时候一个项目代码的量实在太大,手工改有点不现实,这种情况下注释转换的作用就体现了出来。我们以下部分注释为例进行测试//每个区...
2018-03-23 20:30:01 221
原创 C C++中关于值传递和引用传递,指针传递之间的区别
首先对这三种传递方式进行一个了解值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。而指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者。对比值传递,指针/引用传递可以将改变由形参“传给”实参(实际上就是直接在实参...
2018-03-22 20:16:32 453
原创 求一个整形数的二进制数中1的个数~
太easy了,直接上代码了#include<iostream>using namespace std;int main(){ int x = 9999; int countx = 0; while(x) { countx++; x = x&(x-1); } cout<<countx<<endl; return 0;}0.0...
2018-03-21 20:43:02 342
原创 一道简单的C++笔试题,关于抽象shape类求图形周长的问题~
题目如下下列shape类是一个表示形状的抽象类,length()为求图形周长的函数,total()则是一个通用的用以求不同形状的图形周长总和的函数。请从shape类派生三角形类(striangle),矩形类(rectangle),并给出具体的求周长函数。给出shape,total的定义如下所示。class shape{public:virtual float length()=0};float t...
2018-03-21 20:34:17 2378
原创 用C++写一个简单的邻接表~
邻接表是图的一种最主要存储结构,用来描述图上的每一个点。对图的每个顶点建立一个容器(n个顶点建立n个容器),第i个容器中的结点包含顶点Vi的所有邻接顶点。实际上我们常用的邻接矩阵就是一种未离散化每个点的边集的邻接表。首先是邻接表的简历 采用插入顶点的方式将顶点一一插入再依次插入边引入自己所写的一个队列 实际上引入系统的队列就可以了#include <iostream>using na...
2018-03-20 20:18:48 922
原创 用C++&递归的方法实现二叉树的基本功能~
代码各功能的实现主要是运用递归的方法运用递归的方法特点就是代码简短且易于理解首先是头文件的引入 引入了队列#include<iostream>#include<queue>using namespace std;然后是树的实现部分 用类的方法实现函数实现方法均在类内实现//运用递归实现各项功能class Node //节点{public: Node(char...
2018-03-16 18:46:12 331
转载 【转】C++空类默认函数~
定义一个空的C++类,例如class Empty { }一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,一般编译过去就相当于class Empty{ public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty(); // 析构函数 Empty& ...
2018-03-15 17:32:50 215
原创 一个简单的字幕滚动程序~~
首先先放上测试结果其次是代码#include<iostream>#include<windows.h>using namespace std;void main(){ char str[]="young"; int i,j=0,k=0; int len = strlen(str); for(i=0;i<len;i++) { k++; Sle...
2018-03-15 17:23:06 1710
原创 用C++编写一个简单的员工工资管理系统~
用基础的C++语言编写一个简单的员工工资管理系统系统功能简单 但可以进行更多功能的改进代码较为简单 很多地方仅是为了方便调试仍有许多不足的地方需要改进代码如下#include<iostream>#include<string>using namespace std;#define MAX 10//员工工资管理class Employee{public: E...
2018-03-13 16:49:29 11147 3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人