第二篇數組
繆誤21:位圖數據是按照紅綠藍順序存儲的網絡
你們都知道位圖的顏色是由紅、綠、藍三個份量構成的,可是位圖顏色數據存儲的方式則不是按照這個順序存儲的,而是按照藍、綠、紅的順序存儲的。而且對於真彩色位圖來講,位圖的顏色數據是倒序存儲的,即位圖的第一行數據位於位圖數據的最底部。socket
第三篇函數
細節12 :內存中的數組性能
在C++中經過數組能夠操做內存,建立數組時須要爲數組分配內存空間,操做數組時就是對內存空間中的數組元素進行操做。數組建立後,數組引用和數組元素分別存儲在棧內存和堆內存中,並經過數組引用與數組元素的下標對數組元素進行操做。(數組引用即數組名)設計
細節18:使用省略號做爲函數的參數指針
省略號參數表明的含義是函數的參數是不固定的,能夠傳遞一個或多個參數。對於printf函數能夠輸出一項信息,也能夠輸出多項信息。
定義帶省略號參數的函數以下:
void OutPutInfo(int num, ...)
{}內存
對於上述方式的函數,在編寫函數體時須要一一讀取用戶傳遞的實際參數。可使用va_list類型、va_start、va_arg、va_end 3個宏讀取傳遞到函數中的參數值。作用域
細節19:函數的重載開發
一、函數的返回值類型不能做爲區分重載函數的一部分。
二、對於普通函數參數來講const關鍵字不做爲區分重載函數的標識,可是若是參數的類型是指針或引用類型,則const關鍵字將做爲重載函數的標識。所以,下面的函數重載是合法的:
bool Validate(const int *x){}
bool Validate(int *x){}
三、參數的默認值不做爲區分重載函數的標識。
四、使用typedef自定義的類型不做爲重載的標識
五、局部域中聲明的函數將隱藏而不是重載全局域中的函數。
bool Validate(float x)
{
printf("浮點參數函數\n");
return (x>0) ? true : false;
}
int main(int argc, char **argv)
{
bool Validate(double x);
Validate(10.5f);
return 0;
}
此時main函數中的Validate將全局函數隱藏而不是重載了全局函數,須要注意的是,函數重載是發生在同一做用域下的同名函數。若是此時須要使用全局函數,可使用全局做用域符::。
細節25:析構函數
注意析構函數的調用順序與構造函數相反。
細節42:指針引用做爲函數參數
void TestPtr(int* &pArray);
第七章
細節26:TCP粘包的煩惱
TCP協議爲傳輸數據提供了可靠的保障。可是,對於技術開發人員來講,使用TCP協議有一個最大的煩惱,就是出現粘包的狀況。一般,用戶在對一組數據分組發送的時候,系統爲了提升性能會將多個數據包組合到一塊兒,而後統一發送。用戶在接收數據包的時候,有時會一次接收到多個數據包,有時也會接收到一個不完整的數據包(數據包的餘下部分在下次接收數據中),這要視當時的網絡狀況而定。這就是說用戶在發送數據時,雖然逐個數據包發送,可是系統爲了提升性能,會批量地發送多個數據包,而接收端每次接受的內容可能包含多個數據包,也可能包含一個數據包的一部分數據。例如,一次接受3個數據包數據、2.2個數據包數據或者0.4個數據包數據。這就要求開發人員在設計接收端時須要本身對各類狀況進行處理。可是一般使用一個原則是本身定義的數據包的結構不要太大,也就是在接收端首次結束數據時,可以獲取到一個完整的數據包結構。
細節29:套接字的阻塞模式
依據套接字執行方式的不一樣,能夠將套接字分爲兩類,即阻塞套接字和非阻塞套接字。在阻塞套接字中,套接字函數的執行會一直等待,直到函數調用完成才返回。在非阻塞套接字中,套接字函數的調用會當即返回,將控制權交給程序。
默認狀況下,套接字爲阻塞套接字。爲了將套接字設置爲非阻塞套接字,須要使用ioctlsocket函數。例如,下面的代碼在建立一個套接字後,將套接字設置爲非阻塞套接字。
unsigned long nCmd;
SOCKET clientSock = socket(AF_INET, SOCK_STREAM, 0);
int nState = ioctlsocket(clientSock, FIONBIO, &nCmd);
if(0 != nState)
{
MessageBox("設置套接字非阻塞模式失敗");
}
細節30:定義用戶通訊協議
協議是通訊雙方進行交互的基石。它定義了雙方通訊的規則。咱們在開發網絡應用程序時,一般都須要本身定義一個協議。例如,設計一個聊天程序,用戶可能傳遞文本信息、文件數據或表情信息。每一種信息咱們在封裝數據包時都須要有一個標誌位來標記數據的類型。接收端讀取數據包中的協議,根據不一樣類型的數據進行相關操做。這就是一個簡單的網絡通訊協議。其實,我認爲http、ftp、telnet等等,這些就是這樣定義出來的。
細節31:抓取網絡數據包
當用戶在局域網中傳遞數據時,處於同一網段內的全部計算機的網卡都會收到這些數據,儘管它不是傳遞數據的目的地。利用這一特色,咱們就能夠截獲局域網中傳遞的數據。
爲了能獲取經過網卡的數據,須要建立原始套接字。用戶能夠將socket函數的第二個參數設置爲SOCK_RAW來建立原始套接字。例如:
m_sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
由原始套接字獲取的數據是IP數據報,而不只僅是一個用戶數據。它還包含IP數據頭和相應協議的數據頭,最後纔是用戶數據。爲了得到用戶數據,須要逐一去掉IP數據頭及各個協議的數據頭。
細節39:任務欄托盤菜單要設計任務欄托盤菜單,須要使用Shell_NotifyIcon函數。