#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.改善程序結構。一個既長又複雜的進程能夠考慮分爲多個線程,成爲幾個獨立或半獨 立的運行部分,這樣的程序會利於理解和修改。 其餘狀況都使用單線程。