转换IP地址格式的方法
IP 地址和如何处理他们现在我们很幸运,因为我们有很多的函数来方便地操作 IP 地址。没有必要用手工计算 他们,也没有必要用 << 操作符来操作
long。
首先,假设你用 struct sockaddr_in ina,你想将 IP 地址 "132.241.5.10" 储存到其中。你要用的函数是 inet_addr(),转换 numbers-and-dots 格式的 IP 地址到unsigned long。这个工作可以这样来做:
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
注意:inet_addr() 返回的地址已经是按照网络字节顺序的,你没有必要再去调用 htonl()。
上面的代码可不是很健壮 (robust),因为没有错误检查。inet_addr() 在发生错误的时候返回-1。记得二进制数吗? 在 IP 地址为 255.255.255.255 的时候返回的是(unsigned)-1!这是个广播地址!记住正确的使用错误检查。
好了,你现在可以转换字符串形式的 IP 地址为 long 了。那么你有一个数据结构 struct in_addr,该如何按照numbers-and-dots 格式打印呢? 在这个 时候,也许你要用函数 inet_ntoa() ("ntoa" 意思是"network to ascii"):
printf("%s",inet_ntoa(ina.sin_addr));
他将打印 IP 地址。注意的是:函数 inet_ntoa() 的参数是 struct in_addr,而不是long。同时要注意的是他返回的是一个指向字符的指针。 在 inet_ntoa 内部的指针静态地储存字符数组,因此每次你调用inet_ntoa() 的时候他将覆盖以前的内容。例如:
char *a1, *a2;
.
.
a1 = inet_ntoa(ina1.sin_addr); /* this is 198.92.129.1 */
a2 = inet_ntoa(ina2.sin_addr); /* this is 132.241.5.10 */
printf("address 1: %s/n",a1);
printf("address 2: %s/n",a2);
运行结果是:
address 1: 132.241.5.10
address 2: 132.241.5.10
如果你想保存地址,那么用 strcpy() 保存到自己的字符数组中
本文地址:http://www.45fan.com/a/question/73732.html