Unix網路程式設計(二) 位元組排序與位址轉換函式

2021-07-10 05:00:36 字數 2456 閱讀 7964

在進行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.非常感謝 記憶體中有兩種方法儲存位元組 一種是將低序位元組儲存在起始位置,稱為小端位元組序。一種是將高序位元組村出來起始位置,稱為大端位元組序。網際協議使用大端...