IP處理函數inet_aton()和inet_ntoa(),inet_pton,inet_ntop


inet_ntoa:

功能:
將一個IP轉換成一個互聯網標准點分格式的字符串。
原型:
char FAR * inet_ntoa( struct in_addr  in);
返回值:
如果正確,返回一個字符 指針,指向一塊存儲着點分格式IP地址的靜態緩沖區(同一線程內共享此內存);錯誤,返回NULL。
 
與此相反的函數:
inet_aton()是一個將一個字符串IP地址轉換為一個32位的網絡序列IP地址。
完整描述:
int inet_aton(const char *string, struct  in_addr*addr);
參數描述:
1 輸入參數string包含 ASCII表示的IP地址。
2 輸出參數addr是將要用新的IP地址更新的結構。
返回值:
如果這個函數成功,函數的返回值非零,如果輸入地址不正確則會返回零。使用這個函數並沒有 錯誤碼存放在errno中,所以它的值會被忽略。
函數說明及舉例
對於這個函數有一點迷惑的就是這個 函數調用所需要的兩個參數。
如果我們定義了一個 AF_INET 套接口地址:
struct sockaddr_in adr_inet; /* AF_INET */
提供給inet_aton 函數調用的第二個參數 指針為 &adr_inet.s in_addr
 測試代碼如下
 
  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_pton,inet_ntop這兩個函數較新,對ipv4和ipv6地址都能處理。
p代表presentation,n代表numeric。
presentation格式通常是asciil串,nueric格式則是存在於套接口地址結構中的二進制值。
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM