typedef
理解复杂声明可用的“右左法则”:
从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。
举例:
int (*func)(int *p);
首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。
int (*func[5])(int *);
func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。
也可以记住2个模式:
type (*)(….)函数指针
type (*)[]数组指针
链接:http://www.cnblogs.com/charley_yang/archive/2010/12/15/1907384.html
注意:
记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。
比如:
typedef char* PSTR;
然后:
int mystrcmp(const PSTR, const PSTR);
const PSTR实际上相当于const char*吗?不是的,它实际上相当于char* const。
原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char* const。
简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。
Runnable多线程操作
链接:http://blog.csdn.net/lcfigo1/article/details/6499767
Event事件
当创建一个线程时,其实那个线程是一个循环。这样就带来了一个问题,在那个死循环里要找到合适的条件退出那个死循环,那么是怎么样实现它的呢?在Windows里往往是采用事件的方式,当然还可以采用其它的方式。在这里先介绍采用事件的方式来通知从线程运行函数退出来,它的实现原理是这样,在那个死循环里不断地使用Wait(poco库里的wait函数)函数来检查事件是否满足,如果满足就退出线程,不满足就继续运行。
通过函数SetEvent/ResetEvent分别将EVENT设置为发信号与不发信号。
wait函数在事件所指定的对象(该对象可以是类,也可以是事件本身)为发信号状态时才退出线程
文本文件&二进制文件
链接:
http://www.xuebuyuan.com/1082559.html
http://zhidao.baidu.com/link?url=PoPDcyQd7LFeGo_VFIjRH8gV8ucisLKoRyDXw0h37jLTscf7w_OCN8D8NAXQH6mWEc4K7c5QvOryQdyF2nlPpK
NPF—网络数据包过滤器
Netgroup Packet Filter 网络数据包过滤器
〖NPF Device driver〗NPF驱动器
网络数据包过滤器(Netgroup Packet Filter,NPF)是Winpcap的核心部分,它是Winpcap完成困难工作的组件。它处理网络上传输的数据包,并且对用户级提供可捕获(capture)、发送(injection)和分析性能(analysis capabilities)。
它不仅提供了基本的特性(例如抓包),还有更高级的特性(例如可编程的过滤器系统)。前者可以被用来约束一个抓包会话只针对网络通信中的一个子集,后者提供了一个强大而简单的统计网络通信量的机制。
NIC—网卡
网卡(Network Interface Card,简称NIC),也称网络适配器,是电脑与局域网相互连接的设备。无论是普通电
脑还是高端服务器,只要连接到局域网,就都需要安装一块网卡。如果有必要,一台电脑也可以同时安装两块或多块网卡。
平常所说的网卡就是将PC机和LAN连接的网络适配器。网卡(NIC) 插在计算机主板插槽中,负责将用户要传递的数据转换为网络上其它设备能够识别的格式,通过网络介质传输。
io_service
详见链接:(http://www.cnblogs.com/TianFang/archive/2013/02/02/2890366.html)
API相关介绍
winAPI、SDK、CRT三者关系图:
winAPI
Application Programming Interface应用程序编程接口,现代的应用程序如果想访问硬件,就必须通过操作系统,具体来说就是使用操作系统提供的API。一个API就是一些功能的统一接口,它能把硬件的这些功能抽 象地统一起来,让程序员集中精力实现他们想要的功能。
SDK
平台软件开发包(Platform Software Development Kit),软件开发员在windows平台上开发软件。PSDK包含如下东东:
- 包含这些API生命的头文件;
- 包含这些API生命的头文件;
- 用于连接的相应的库文件(通过它们能够在相应的DLL中定位到这些API函数);
- 相关的说明文档;
各种帮助工具;
例如,如果要打开或创建一个文件,我们要调用函数CreateFile,它在头文件”WinBase.h”中声明,通过库文件”Kernel32.lib”在dll文件中进行函数定位。
Windows API的函数名称依照骆驼命名法命名,因此不同的函数很容易区分。常量和宏的命名一般是大写。在相应的文档里,会详细的说明每个函数所需要的头文件、库文件以及能够运行的相关平台。
CRT
C运行时程序库,基于操作系统的API函数,软件厂商实现了C运行时程序库(CRT)。CRT由一些头文件和相应的源文件构成,这些文件实现了一些基础的公共操作,如字符 串操作、一些数学运算函数和基本的输入\输出等操作。 CRT的函数名称一般都是小写的,宏和常数是大写的,而一些扩展则通常具有一定的以下划线作为开头的标识,例如函数_mkdir。针对这些扩展,相应的文档都会详细的予以说明。
C++标准库
C++编程语言有其自己的一套标准库。这些库包含了一系列的类和函数,可以在编程中使用。
通常,人们一提起C++标准库就下意识地直接联想到STL。STL是标准模板库(Standard Template Library)的缩写。STL最近的版本是作为C++标准库的一个子集发布的。但是现实中STL已经无处不在了,成了C++标准库的同义语。
C++标准库的大致组成:
- 容器。一般都是一些普通的数据结构,如vector,set,list,map;
- 迭代器。提供了一种统一的访问标准容器的方法;
- 算法。实现了一些常用的算法,这些算法一般都通过迭代器访问容器,而不是直接访问容器,所以一种算法可以作用于不同的容器;
- 分配器。负责容器内每个元素的内存空间的分配与回收;
- 函数对象以及Utilities。利用他们便于算法作用于各种容器;
- 字符流。把输入/输出流作为一个统一的对象处理;
- C动态运行库。由于要向后兼容C,所以CRT要作为C++标准库的一部分出现;
总结:本文大体上介绍了Windows API、CRT和STL相互之间的关系和依赖顺序。对于用户态的程序来说,Windows API是可以用到的计算机的最低一层。处于Windows API之上的则是C的动态运行库,它对操作系统进行了封装,并隐藏了不同的操作系统之间的差异。标准C++库则提供了更多的功能,并且把CRT作为它的一 部分。通过标准的函数以及相关类可以写出跨平台的程序,这个程序只需在新的平台上重新编译一次发布出来,代码不需要改动。
详见链接:(http://blog.163.com/ljm1113@126/blog/static/57984452201191493917125/)
时间结构体FILETIME和SYSTEMTIME
结构体定义:
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
常用操作函数:
- 1 得到当前UTC时间
void GetSystemTime(LPSYSTEMTIME lpSystemTime);
- 2 得到当地时间
void GetLocalTime(LPSYSTEMTIME lpSystemTime);
- 3 SYSTEMTIME转成FILETIME
BOOL SystemTimeToFileTime(
const SYSTEMTIME* lpSystemTime,
LPFILETIME lpFileTime
);
- 4 FILETIME转成SYSTEMTIME
BOOL FileTimeToSystemTime(
const FILETIME* lpFileTime,
LPSYSTEMTIME lpSystemTime
);
- 5 当地时间转成UTC时间
BOOL LocalFileTimeToFileTime(
const FILETIME* lpLocalFileTime,
LPFILETIME lpFileTime
);
- 6 UTC时间转成当地时间
BOOL FileTimeToLocalFileTime(
const FILETIME* lpFileTime,
LPFILETIME lpLocalFileTime
);
详见链接:(http://blog.csdn.net/morewindows/article/details/8654298)
模板
详见链接:(http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html)
operator操作符
详见链接:(http://blog.csdn.net/my_heart_/article/details/51534624)