ntohs()

ntohs()是一個函式名,作用是將一個16位數由網路位元組順序轉換為主機位元組順序 。

簡述

將一個無符號短整型數從網路位元組順序轉換為主機位元組順序。

#include <netinet/in.h>

uint16_t ntohs(uint16_t netshort);

netshort:一個以網路位元組順序表達的16位數。

注釋

本函式將一個16位數由網路位元組順序轉換為主機位元組順序。

返回值

ntohs()返回一個以主機位元組順序表達的數。

參見

htonl(), htons(), ntohl().

ntohs, ntohl,htons,htonl的比較

其他

htons()

本函式將一個16位數從主機位元組順序轉換成網路位元組順序。

返回值:

htons()返回一個網路位元組順序的值。

這2個函式提供了主機位元組順序與網路位元組順序的轉換

比如網路位元組 為 00 01

u_short a如果直接對應的話 a=0100; 為什麼呢?因為主機是從高位元組到低位元組的,所以應該轉化後a=ntohs(0001); 這樣 a=0001;

htonl()

htonl()表示將32位的主機位元組順序轉化為32位的網路位元組順序 htons()表示將16位的主機位元組順序轉化為16位的網路位元組順序(ip地址是32位的連線埠號是16位的 )

將IP位址轉換成長整型:首先,假設你已經有了一個sockaddr_in結構體ina,你有一個IP位址"132.241.5.10" 要儲存在其中,你就要用到函式inet_addr(),將IP位址從點數格式轉換成無符號長整型。使用方法如下:ina.sin_addr.s_addr = inet_addr("132.241.5.10");

注意,inet_addr()返回的地址已經是網路位元組格式,所以你無需再調用函式htonl()。

我們現在發現上面的代碼片斷不是十分完整的,因為它沒有錯誤檢查。顯而易見,當inet_addr()發生錯誤時返回-1。記住這些二進制數字?(無符號數)-1僅僅和IP位址255.255.255.255相符合!但這可是廣播地址!所以,記住要先進行錯誤檢查。

怎樣將一個in_addr結構體輸出成點數格式?你要用到函式 inet_ntoa()("ntoa"的含義是"network to ascii"),就像這樣:printf("%s",inet_ntoa(ina.sin_addr));它將輸出IP位址。需要注意的是inet_ntoa()將結構體in_addr作為一個參數,不是長整形。同樣需要注意的是它返回的是一個指向一個字元的指針。它是一個由inet_ntoa()控制的靜態的固定的指針,所以每次調用 inet_ntoa(),它就將覆蓋上次調用時所得的IP位址。例如:

char *a1, *a2;

.

.

a1 = inet_ntoa(ina1.sin_addr);

a2 = inet_ntoa(ina2.sin_addr);

printf("address 1: %s ",a1);

printf("address 2: %s ",a2);

輸出如下:

address 1: 132.241.5.10

address 2: 132.241.5.10

假如你需要保存這個IP位址,使用strcpy()函式來指向你自己的字元指針。

inet_ntoa()

簡述:

將網路地址轉換成“.”點隔的字元串格式。

#include <winsock.h>

char FAR* PASCAL FAR inet_ntoa( struct in_addr in);

in:一個表示Internet主機地址的結構。

注釋:

本函式將一個用in參數所表示的Internet地址結構轉換成以“.” 間隔的諸如“a.b.c.d”的字元串形式。請注意inet_ntoa()返回的字元串存放在WINDOWS套接口實現所分配的記憶體中。應用程式不應假設該記憶體是如何分配的。在同一個執行緒的下一個WINDOWS套接口調用前,數據將保證是有效。

返回值:

若無錯誤發生,inet_ntoa()返回一個字元指針。否則的話,返回NULL。其中的數據應在下一個WINDOWS套接口調用前複製出來。

參見: inet_addr().

測試代碼如下

#pragma comment (lib,"Ws2_32.lib")

//noths.obj : error LNK2001: unresolved external ymbol _inet_addr@4

#include <winsock.h>

#include <iostream.h>

#include <stdio.h>

int main(int aargc, char* argv[])

{

struct in_addr addr1,addr2;

unsigned long 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)); //注意這一句的運行結果

printf("%s \n", inet_ntoa(addr1));

printf("%s \n", inet_ntoa(addr2));

return 0;

}

實際運行結果如下:

192.168.0.74 : 192.168.0.74 //從這裡可以看出,printf里的inet_ntoa只運行了一次。

192.168.0.74

211.100.21.179

inet_ntoa返回一個char *,而這個char *的空間是在inet_ntoa裡面靜態分配的,所以inet_ntoa後面的調用會覆蓋上一次的調用。第一句printf的結果只能說明在printf裡面的可變參數的求值是從右到左的,僅此而已。

相關詞條

相關搜尋

熱門詞條

聯絡我們