htonl() 簡(jiǎn)述: 將主機(jī)的無(wú)符號(hào)長(zhǎng)整形數(shù)轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序。 #include <winsock.h> u_long PASCAL FAR htonl( u_long hostlong); hostlong:主機(jī)字節(jié)順序表達(dá)的32位數(shù)。 注釋: 本函數(shù)將一個(gè)32位數(shù)從主機(jī)字節(jié)順序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序。 返回值: htonl()返回一個(gè)網(wǎng)絡(luò)字節(jié)順序的值。 參見(jiàn): htons(), ntohl(), ntohs(). htons() 簡(jiǎn)述: 將主機(jī)的無(wú)符號(hào)短整形數(shù)轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序。 #include <winsock.h> u_short PASCAL FAR htons( u_short hostshort); hostshort:主機(jī)字節(jié)順序表達(dá)的16位數(shù)。 注釋: 本函數(shù)將一個(gè)16位數(shù)從主機(jī)字節(jié)順序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序。 返回值: htons()返回一個(gè)網(wǎng)絡(luò)字節(jié)順序的值。 參見(jiàn): htonl(), ntohl(), ntohs(). --------------------------------------------- 簡(jiǎn)單地說(shuō),htons()就是將一個(gè)數(shù)的高低位互換 (如:12 34 --> 34 12) VB表示: MsgBox Hex(htons(&H1234)) 顯示值為 3412 inet_addr() 簡(jiǎn)述:將一個(gè)點(diǎn)間隔地址轉(zhuǎn)換成一個(gè)in_addr。 #include <winsock.h> unsigned long PASCAL FAR inet_addr( const struct FAR* cp); cp:一個(gè)以Internet標(biāo)準(zhǔn)“.”間隔的字符串。 注釋: 本函數(shù)解釋cp參數(shù)中的字符串,這個(gè)字符串用Internet的“.”間隔格式表示一個(gè)數(shù)字的Internet地址。返回值可用作Internet地址。所有Internet地址以網(wǎng)絡(luò)字節(jié)順序返回(字節(jié)從左到右排列)。 Internet地址用“.”間隔的地址可有下列幾種表達(dá)方式: a.b.c.d,a.b.c,a.b,a 當(dāng)四個(gè)部分都有定值時(shí),每個(gè)都解釋成一個(gè)字節(jié)數(shù)據(jù),從左到右組成Internet四字節(jié)地址。請(qǐng)注意,當(dāng)一個(gè)Internet地址在Intel機(jī)器上表示成一個(gè)32位整型數(shù)時(shí),則上述的字節(jié)為“d.c.b.a”。這是因?yàn)镮ntel處理器的字節(jié)是從右向左排列的。 請(qǐng)注意:只有Berkeley支持下述表達(dá)法,Internet其余各處均不支持??紤]到與軟件的兼容性,應(yīng)按規(guī)定進(jìn)行使用。 對(duì)一個(gè)三部分地址,最后一部分解釋成16位數(shù)據(jù)并作為網(wǎng)絡(luò)地址的最右兩個(gè)字節(jié)。這樣,三部分地址便很容易表示B組網(wǎng)絡(luò)地址,如“128.net.host”. 對(duì)一個(gè)兩部分地址,最后一部分解釋成24位數(shù)據(jù)并作為網(wǎng)絡(luò)地址的最右三個(gè)字節(jié),這樣,兩部分地址便很容易表示C組網(wǎng)絡(luò)地址,如“net.host”。 對(duì)僅有一個(gè)部分的地址,則將它的值直接存入網(wǎng)絡(luò)地址不作任何字節(jié)的重組。 返回值: 若無(wú)錯(cuò)誤發(fā)生,inet_addr()返回一個(gè)無(wú)符號(hào)長(zhǎng)整型數(shù),其中以適當(dāng)字節(jié)順序存放Internet地址。如果傳入的字符串不是一個(gè)合法的Internet地址,如“a.b.c.d”地址中任一項(xiàng)超過(guò)255,那么inet_addr()返回INADDR_NONE。 參見(jiàn): inet_ntoa(). inet_addr()函數(shù)的實(shí)現(xiàn) 輸入是點(diǎn)分的IP地址格式(如A.B.C.D)的字符串,從該字符串中提取出每一部分,轉(zhuǎn)換為ULONG,假設(shè)得到4個(gè)ULONG型的A,B,C,D, inet_ntoa() 簡(jiǎn)述: 將網(wǎng)絡(luò)地址轉(zhuǎn)換成“.”點(diǎn)隔的字符串格式。 #include <winsock.h> char FAR* PASCAL FAR inet_ntoa( struct in_addr in); in:一個(gè)表示Internet主機(jī)地址的結(jié)構(gòu)。 注釋: 本函數(shù)將一個(gè)用in參數(shù)所表示的Internet地址結(jié)構(gòu)轉(zhuǎn)換成以“.” 間隔的諸如“a.b.c.d”的字符串形式。請(qǐng)注意inet_ntoa()返回的字符串存放在WINDOWS套接口實(shí)現(xiàn)所分配的內(nèi)存中。應(yīng)用程序不應(yīng)假設(shè)該內(nèi)存是如何分配的。在同一個(gè)線程的下一個(gè)WINDOWS套接口調(diào)用前,數(shù)據(jù)將保證是有效。 返回值: 若無(wú)錯(cuò)誤發(fā)生,inet_ntoa()返回一個(gè)字符指針。否則的話,返回NULL。其中的數(shù)據(jù)應(yīng)在下一個(gè)WINDOWS套接口調(diào)用前復(fù)制出來(lái)。 測(cè)試代碼如下 include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> int main(int aargc, char* argv[]) { struct in_addr addr1,addr2; ulong l1,l2; l1= inet_addr("192.168.0.74"); l2 = inet_addr("211.100.21.179"); memcpy(&addr1, &l1, 4); memcpy(&addr2, &l2, 4); printf("%s : %s\n", inet_ntoa(addr1), inet_ntoa(addr2)); //注意這一句的運(yùn)行結(jié)果 printf("%s\n", inet_ntoa(addr1)); printf("%s\n", inet_ntoa(addr2)); return 0; } 實(shí)際運(yùn)行結(jié)果如下: 192.168.0.74 : 192.168.0.74 //從這里可以看出,printf里的inet_ntoa只運(yùn)行了一次。 192.168.0.74 211.100.21.179 inet_ntoa返回一個(gè)char *,而這個(gè)char *的空間是在inet_ntoa里面靜態(tài)分配的,所以inet_ntoa后面的調(diào)用會(huì)覆蓋上一次的調(diào)用。第一句printf的結(jié)果只能說(shuō)明在printf里面的可變參數(shù)的求值是從右到左的,僅此而已。 參見(jiàn): inet_addr(). |
聯(lián)系客服