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格式则是存在于套接口地址结构中的二进制值。