socket 編程下 inet_ntoa() 函數的使用與注意事項

函數聲明:char *inet_ntoa (struct in_addr);
  返回點分十進制的字符串在靜態內存中的指針。
  所在頭文件:<arpa/inet.h>
  //end linux 下

   函數功能:網絡地址轉換成“.”點隔的字符串格式

        現在我們很幸運,因爲我們有很多的函數來方便地操作 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()。

 

我們如何輸出一個點分十進制的IP呢?我們來看看下面的程序:

   

#include <stdio.h> 
  #include <sys/socket.h> 
  #include <netinet/in.h> 
  #include <arpa/inet.h> 
  #include <string.h> 
  int main(int argc, 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裏面的可變參數的求值是從右到左的,僅此而已。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章