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() 保存到自己的字符数组中
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值