在進行unix網路程式設計時,總是分不清什麼時候需要用到位元組操作函式,並且在遇到這些函式時十分陌生。於是,便有了這篇文章
記憶體中儲存資料有兩種方式:大端與小端。假設起始存放位址為1000
1. 小端:低權重位元組在低位址處。例如 0x1122, 0x11<<8 是高權重位元組,所以其在高位址1001處;0x22是低權重位元組,所以在1000處。小端也是符合我們平常思維方式的儲存方法。
2. 大端:高權重位元組在低位址處。例如 0x5566, 0x55<<8 是高權重位元組,所以在低位址1000處。0x66(低權重)在高位址1001處。
不同的體系架構的計算機,記憶體儲存方式就不統一,所以在網路通訊時需要乙個統一的位元組順序,網際通訊協議使用大端位元組,這個就是網路位元組序。
那麼在什麼時候需要使用網路位元組序呢?在查閱了一些資料後,發現埠號和ip位址必須轉換成網路位元組序。在傳輸資料時,short和long型資料最好轉換,而字串傳送和接受卻不需要轉換。這裡希望明白的朋友交流一下,為什麼字串傳送不需要轉換,是因為ascii的關係嗎?
參考: 網路傳輸資料要不要轉換大小端位元組序的問題
那麼怎麼將資料轉換成網路位元組序呢?這裡可以分成兩種,第一種對於整型變數的轉換,第二種是對於ip位址的轉換。
//123(主機序) ---> 123(網路位元組序)
//用於傳送時
uint16_t htons(uint16_t host16bitvalue);
uint32_t htonl(uint32_t host32bitvalue);
以上的兩個函式是將主機位元組序」host」轉換成網路位元組序」net」。」s」代表short,轉換的是16-bit的整型;」l」代表long,轉換的是32-bit的整型。
與之相對的,是網路位元組序轉換成主機位元組序。
//456(網路序) ---> 456(主機序)
//用於接收時
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohl(uint32_t net32bitvalue);
#include
//以下僅適用與ipv4
//"address" to net,即ip位址 ---> 網路位元組序
//例如 "192.168.1.106" --> struct in_addr
//若strptr(address字串)有效,則返回1。否則返回0
int inet_aton(const
char *strptr, struct in_addr *addrptr);
//net to "address"
//返回值是點分式的字串ip位址
char *inet_ntoa(struct in_addr inaddr);
//address to net 的另一種形式
//通過返回值而不是指標返回ip位址的網路位元組序
in_addr_t inet_addr(const
char *strptr);
注意,上面的三個函式僅適用於ipv4的位址
下面,將介紹ipv4/v6通用的轉換函式:
//ipv4/v6通用轉換函式
/*** @brief inet_pton "presentation" to net
** @param strptr -- const char *, presentation, 例如 "192.168.1.100"
* @param addrptr -- void *, 通過指標返回in_addr或in6_ddr結構體
** @returns 成功返回1,否則返回0
*/int inet_pton(int family, const
char *strptr, void *addrptr);
/*** @brief inet_ntop
** @param family 協議族,af_inet或af_inet6
* @param addrptr -- const void *, 要轉換的in_addr或in6_addr
* @param strptr -- char *,存放轉換的結果
* @param len -- size_t,目標儲存單元(strptr)的大小
* 通常為 inet_addrstrlen(16) 或 inet6_addrstrlen(46)
* @returns 轉換結果的指標,即 strptr
*/const
char* inet_ntop(int family, const
void *addrptr, char *strptr, size_t len);
2 位元組跳動 陣列與排序
1 三數之和 原文 2 島嶼的最大面積 原文 3 搜尋旋轉排序陣列 public int search int nums,int target else 條件2 if nums mid nums right else return 1 參考 4 最長連續遞增序列 參考 5 陣列中的第k個最大元素 p...
《UNIX網路程式設計 卷2》 筆記 位元組流與訊息
目前我們給出的管道和fifo的例子通訊雙方使用的都是位元組流i o模型,程式不對它作任何解釋。舉個例子,如果乙個程序從fifo收到100位元組資料,它不知道這100位元組資料是乙個程序傳送的還是多個程序傳送的。如何區分位元組流是哪個程序傳送的?有種常用的技巧就是將資料封裝在一條訊息 可以理解為帶邊界...
Unix網路程式設計(二)套接字位址結構常用函式
註明 本文為學習經驗的總結,絕大部分引用自unix網路程式設計卷一,有錯誤或者交流意見請發郵件至yb.zhaoyubo gmail.com.非常感謝 記憶體中有兩種方法儲存位元組 一種是將低序位元組儲存在起始位置,稱為小端位元組序。一種是將高序位元組村出來起始位置,稱為大端位元組序。網際協議使用大端...