#define SECONDS_PER_YEAR (60*60*24*365)UL安全
#define MIN(A,B) ((A) <=(B) <= (A):(B))服务器
static关键字,静态变量、静态函数架构
Const 只读并发
Volatile 告诉编译器变量是会意外改变的,不能使用寄存器备份socket
能修饰const、指针,两次volatile的指针值是不必定会相同的tcp
比特操做:函数
& 与 逢0全是0,全1才是1spa
| 或 逢1是1,全0才是0操作系统
~ 取反 逢1为0,逢0为1线程
^ 异或 操做相同为0,不一样为1
<< 左移 左边移动抛弃右边补0
>> 右移 右边的移动抛弃左边补0
例子:A^B^B = A
函数模板与类模板
函数模板由函数调用时编译器自动完成,类模板实例化时由程序显式指定
Tcp/IP创建过程
三次握手:Client => Server=>等待(SYN_SEND)
Server=>Clien=>等待(SYN_RECV)
Client=>Server=>完成(ESTABLISHED)
winSock创建步骤
服务器:socker()创建套接字,绑定(bind)并监听(listen),用accept()等待客户端链接
客户端:socker()创建套接字,链接(connect)服务器,链接上后使用send()和recv(),读写数据,直至数据交换完毕,closesocket()关闭套接字
服务器:accept()发现有客户端链接,创建一个新的套接字,自身从新开始等待链接。新套接字使用send()和recv(),读写数据,直至数据交换完毕,closesocket()关闭套接字
select和epoll
select是全部链接轮询操做,epoll是对活跃链接操做;select最大量接受操做系统内核限制,epoll不是;
动态连接库
载入时相似于本地函数明确调用则须要dll的lib描述文件;运行时动态连接能够经过LoadLibrary或LoadLibraryEx载入DLL
C++面向对象的三个基本特征
封装、继承、多态(实现方式覆盖和重载)
纯虚函数和虚函数
纯虚函数vitual func() = 0,构建的类不能生成实例,抽象类,只能用做基类
友元函数的优缺点
有点:能直接访问类的私有保护对象,提高效率
缺点:破坏了类的封装,有安全漏洞
线程和进程
线程是最小的执行单元,一个进程包含多个线程;进程有独立的地址空间,进程崩溃对其余进程没影响;线程有本身的堆栈和局部变量,没有单独的地址空间,一个线程死掉进程就会出现问题;进程切换耗费的资源比线程切换大;
进程间通讯
无名管道(pipe)、高级管道(popen)、有名管道(named pipe)、信号量、消息队列、信号、共享内存、Socket
线程间通讯
全局变量、消息队列、临界区、互斥区、事件、信号量
进程和线程同步方式
临界区、互斥区、事件、信号量
tcp和udp区别
Tcp:传输控制协议,须要创建可靠地链接,三次握手,速度慢;
Udp:用户数据报协议,不与对方创建链接直接发送数据,可靠性差,速度快;
tcp/ip的状态
TCP链接:
1.CLOSED、2.LISTEN、3.SYN_SENT、4.SYN_RCVD、5.ESTABLISHED
TCP关闭
1.FIN_WAIT_1、2.FIN_WAIT_2、3.CLOSE_WAIT、4.LAST_ACK、5.CLOSING、6.TIME_WAIT
程序何时应该使用线程,何时单线程效率高
1.耗时的操做使用线程,提升应用程序响应
2.并行操做时使用线程,如C/S架构的服务器端并发线程响应用户的请求。
3.多CPU系统中,使用线程提升CPU利用率
4.改善程序结构。一个既长又复杂的进程能够考虑分为多个线程,成为几个独立或半独 立的运行部分,这样的程序会利于理解和修改。 其余状况都使用单线程。