#includeint main(int argc,char **ar**v)un_test;
un_test.value=0x1a2b;
printf("%x %x\n",un_test.union_bytes[0],un_test.union_bytes[1]);
}
結果:
總結:short型別佔2個位元組,例如十六進製制數0x1a2b中1a為高位元組,2b為低位元組,我們使用union使單位元組長度的char陣列union_bytes共享value的記憶體,在以十六進製制形式輸出,明顯看出高位位元組2b被放在記憶體中的低位位址處(記憶體讀取順序肯定是由低到高),符合小端模式;
測試乙個2位元組的short的兩種轉換;
int main(int argc,char **ar**v)
結果得以驗證:
long int 也不過是8位元組;
#include #include int main(int argc,char**ar**v)
執行結果:
可以看出來,確實是轉換了,但是列印時候出現了截斷,一開始我以為問題應該處在printf的%x上面,之後改為%lx及%llx同樣不能輸出;
想到另一種可能,以上四個函式涉及short和long兩種型別的轉換,可能正是由於,long型別轉換用於ip位址的轉化,而ip位址為4位元組,通過多次測試也發現可能存在對轉換結果的截斷操作。當輸入引數超過ip位址的4位元組長度時,只返回轉換結果的前4個位元組;
以下鏈結為printf()函式的輸出格式
敲一下吧,選擇「192.168.1.1」其十六進製制數為:0xc0a80101,將其轉化為網路位元組(大端模式)
#include int main(int argc,char** ar**v)
結果:
位元組序列跟我們預期的是相反的,然後考慮機器小端位元組和網路的大端位元組,不繞還好,一繞更暈了。
第一次嘗試理解:
1.函式轉換結果肯定是0x101a8c0錯不了;2.由於主機是小端模式,故而記憶體中應該是0xc0a8011(左為低記憶體),而網路的傳送是由低記憶體位置向高記憶體位置傳送的,所以c0又成為了高位位元組。
第二次嘗試理解:高位位元組和低位址,理解起來廷費勁
1.轉換結果在記憶體中如下:
低位址 --> c0 a8 01 1 --> 高位址
#include #include //多了乙個
#include int main(int argc,char** ar**v)
結果如預期:
是否確實是不可重入的測試:
#include #include #include int main()
~
兩次執行,相互影響,確實是不可重入函式,結果如下;
繼續修改
#include #include //用來使用inet_addrstrlen
#include int main()
inet_addrstrlen=16指的ip字串的長度,例如"255.255.255.255"占用空間為15個字元+、0;而且函式返回的const char位址就是str的位址; linux高效能伺服器程式設計
linux高效能伺服器程式設計 當當網 亞馬遜 目錄 第一章 tcp ip協議族 第二章 ip協議族 第三章 tcp協議詳解 第四章 tcp ip通訊案例 訪問internet 第五章 linux網路程式設計基礎api 第六章 高階io函式 第七章 linux伺服器程式規範 第八章 高效能伺服器框架...
linux 高效能伺服器程式設計
1.高效能定時器 時間輪,時間堆 處理超時時間,如nginx使用紅黑樹,找出最可能超時的事件 2.高效能伺服器程式框架 nginx 使用的是基於事件模型,epoll,不阻塞,非同步處理 兩種高效的事件處理模式 reactor模式 proactor模式 兩種高效的併發模式 半同步 半非同步模式 領導者...
linux高效能伺服器程式設計(1)
linux網路程式設計基礎api 1 socket位址api 2 sockt基礎api sockt的api全部定義在sys socket.h檔案中,包括 建立socket,命名socket,監聽socket,接受連線,發起連線,讀寫資料,獲取位址資訊,檢測帶外標記,以及讀取和設定socket選項。3...