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中,所以它的值會被忽略。
函數說明及舉例
對於這個函數有一點迷惑的就是這個
函數調用所需要的兩個參數。
struct sockaddr_in adr_inet; /* AF_INET */
測試代碼如下
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格式則是存在於套接口地址結構中的二進制值。