htonl(),htons(),inet_addr(),inet_ntoa()函數

 

htonl()

  簡述:
  將主機的無符號長整形數轉換成網絡字節順序。
  #include <winsock.h>
  u_long PASCAL FAR htonl( u_long hostlong);
  hostlong:主機字節順序表達的32位數。
  註釋:
  本函數將一個32位數從主機字節順序轉換成網絡字節順序。
  返回值:
  htonl()返回一個網絡字節順序的值。
  參見:

  htons(), ntohl(), ntohs().

htons()

  簡述:
  將主機的無符號短整形數轉換成網絡字節順序。
  #include <winsock.h>
  u_short PASCAL FAR htons( u_short hostshort);
  hostshort:主機字節順序表達的16位數。
  註釋:
  本函數將一個16位數從主機字節順序轉換成網絡字節順序。
  返回值:
  htons()返回一個網絡字節順序的值。
  參見:
  htonl(), ntohl(), ntohs().
  ---------------------------------------------
  簡單地說,htons()就是將一個數的高低位互換
  (如:12 34 --> 34 12)
  VB表示:
  MsgBox Hex(htons(&H1234))

  顯示值爲 3412

inet_addr()

  簡述:將一個點間隔地址轉換成一個in_addr。
  #include <winsock.h>
  unsigned long PASCAL FAR inet_addr( const struct FAR* cp);
  cp:一個以Internet標準“.”間隔的字符串。
  註釋:
  本函數解釋cp參數中的字符串,這個字符串用Internet的“.”間隔格式表示一個數字的Internet地址。返回值可用作Internet地址。所有Internet地址以網絡字節順序返回(字節從左到右排列)。
  Internet地址用“.”間隔的地址可有下列幾種表達方式:
  a.b.c.d,a.b.c,a.b,a
  當四個部分都有定值時,每個都解釋成一個字節數據,從左到右組成Internet四字節地址。請注意,當一個Internet地址在Intel機器上表示成一個32位整型數時,則上述的字節爲“d.c.b.a”。這是因爲Intel處理器的字節是從右向左排列的。
  請注意:只有Berkeley支持下述表達法,Internet其餘各處均不支持。考慮到與軟件的兼容性,應按規定進行使用。
  對一個三部分地址,最後一部分解釋成16位數據並作爲網絡地址的最右兩個字節。這樣,三部分地址便很容易表示B組網絡地址,如“128.net.host”.
  對一個兩部分地址,最後一部分解釋成24位數據並作爲網絡地址的最右三個字節,這樣,兩部分地址便很容易表示C組網絡地址,如“net.host”。
  對僅有一個部分的地址,則將它的值直接存入網絡地址不作任何字節的重組。
  返回值:
  若無錯誤發生,inet_addr()返回一個無符號長整型數,其中以適當字節順序存放Internet地址。如果傳入的字符串不是一個合法的Internet地址,如“a.b.c.d”地址中任一項超過255,那麼inet_addr()返回INADDR_NONE。
  參見:

  inet_ntoa().

inet_addr()函數的實現

輸入是點分的IP地址格式(如A.B.C.D)的字符串,從該字符串中提取出每一部分,轉換爲ULONG,假設得到4個ULONG型的A,B,C,D,
ulAddress(ULONG型)是轉換後的結果,
ulAddress = D<<24 + C<<16 + B<<8 + A(網絡字節序),即inet_addr(const char *)的返回結果
另外,我們也可以得到把該IP轉換爲主機序的結果,轉換方法一樣
A<<24 + B<<16 + C<<8 + D

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套接口調用前複製出來。
  測試代碼如下
  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)); //注意這一句的運行結果
  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裏面的可變參數的求值是從右到左的,僅此而已。
  參見:
  inet_addr().
發佈了24 篇原創文章 · 獲贊 4 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章