在C/C++寫(xiě)網(wǎng)絡(luò)程序的時(shí)候,往往會(huì)遇到字節(jié)的網(wǎng)絡(luò)順序和主機(jī)順序的問(wèn)題。 這時(shí)就可能用到htons(), ntohl(), ntohs(),htons()這4個(gè)網(wǎng)絡(luò)字節(jié)順序與本地字節(jié)順序之間的轉(zhuǎn)換函數(shù): 之所以需要這些函數(shù)是因?yàn)橛?jì)算機(jī)數(shù)據(jù)表示存在兩種字節(jié)順序:NBO與HBO。 網(wǎng)絡(luò)字節(jié)順序NBO(Network Byte Order): 主機(jī)字節(jié)順序(HBO,Host Byte Order): 由于這個(gè)原因不同體系結(jié)構(gòu)的機(jī)器之間無(wú)法通信,所以要轉(zhuǎn)換成一種約定的數(shù)序,也就是網(wǎng)絡(luò)字節(jié)順序,其實(shí)就是如同power pc那樣的順序 。在PC開(kāi)發(fā)中有ntohl和htonl函數(shù)可以用來(lái)進(jìn)行網(wǎng)絡(luò)字節(jié)和主機(jī)字節(jié)的轉(zhuǎn)換。 #include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); 在windows系統(tǒng)下:htonl(),htons(), ntohl(), ntohs(), inet_addr()使用說(shuō)明
ntohs() 簡(jiǎn)述: ntohl() 簡(jiǎn)述: htons() htonl() 簡(jiǎn)述: inet_ntoa() inet_aton() inet_pton() 指向緩存區(qū)dst的大小,避免溢出,如果緩存區(qū)太小無(wú)法存儲(chǔ)地址的值,則返回一個(gè)空指針,并將errno置為ENOSPC atoi() array to integer將字符串轉(zhuǎn)換為整形數(shù) 首先,假設(shè)你已經(jīng)有了一個(gè)sockaddr_in結(jié)構(gòu)體ina,你有一個(gè)IP地址"132.241.5.10" 要儲(chǔ)存在其中,你就要用到函數(shù)inet_addr(),將IP地址從 點(diǎn)數(shù)格式轉(zhuǎn)換成無(wú)符號(hào)長(zhǎng)整型。 *********************************************************************************************************************************** 測(cè)試代碼如下#include inet_ntoa返回一個(gè)char *,而這個(gè)char *的空間是在inet_ntoa里面靜態(tài)分配的,所以inet_ntoa后面的調(diào)用會(huì)覆蓋上一次的調(diào)用。第一句printf的結(jié)果只能說(shuō)明在printf里面的可變參數(shù)的求值是從右到左的,僅此而已。 |
|
來(lái)自: LibraryOfKevin > 《網(wǎng)絡(luò)編程》