Linux网络编程中的地址问题

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 10:56 点击:

平时我们使用的IP地址是192.168.1.11这种类型的字符串;而在Linux内核中是用二进制方式表达的IP地址。在程序设计中经常要用到字符串表达方式的IP地址和二进制的IP地址之间的转换。
  面对网络编程中众多的地址函数,你hold住了么,tiger哥没hold住,所以就写了此篇文章,希望大家能hold住网络编程。
  前言:结构体struct in_addr结构struct in_addr 在文件<netinet/in.h>中定义,结构in_addr 有一个unsigned long int 类型的成员变量s_addr.通常所说的IP地址的二进制形式就保存在成员变量s_addr中。
  结构struct in_addr的原型如下:structin_addr{ unsigned long  int  s_addr;/*IP地址*/ }一。字符串IP地址转换为二进制形式的IP地址函数1.inet系列函数的原型:#include<sys/socket.h> #include<netinet/in.h> #include<apra/inet.h> int inet_aton(const char *cp,struct in_addr *inp);int addr_t inet_addr(const char *cp);int addr_t inet_network(const char *cp);char * inet_ntoa(struct in_addr in);struct in_addr inet_makeaddr(int net,int host);in_addr_t inet_lnaof(struct in_addr in);in_addr_t inet_netof(struct in_addr in);2.inet_aton()函数int inet_aton(const char*cp,struct in_addr *inp)
  1>函数作用:inet_ation()函数将在cp中存储的点分十进制字符串类型的IP地址,转换为二进制的IP地址,转换后的值保存在指针inp指向的结构struct in_addr中。
  2>形参?  const char *cp:指向字符类型的IP地址。例如“192.168.1.11”?  struct in_addr *inp:指向二进制的网络字节顺序的IP地址structin_addr{ unsignedlong s_addr } 3>函数执行成功则返回非0值,参数无效则返回0. 4>实例:#include<stdio.h> #include<stdlib.h> #include<string.h>
  #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> int main()
  { char buffer[32];structin_addr in;in.s_addr =0;/*输入一个字符串形式的IP地址*/ printf(“pleaseinput the ip addrss\n”);scanf(“%s”,buffer);buffer[31]=‘\0’;printf(“original IP地址:%s\n”,buffer);if( 0 == inet_aton(buffer,&in)){ perror(“inet_aton”);exit(1);}  else  { printf(“after transfer:0x%0x\n”,in.s_addr);} 5> inet_aton函数最后计算出来的是网络字节序的二进制IP 3.inet_addr()函数in_addr_t inet_addr(const char *cp)
  1>函数作用:它将参数cp所指向的字符串形式的IP地址(“192.168.1.11”)转换为二进制的网络字节序的IP地址形式该函数的缺点是:如果IP地址是255.255.255.255.那么调用inet_addr()函数后将返回-1(因为-1的补码形式是0xFFFFFFFF)。所以不建议使用inet_addr()函数,而是使用inet_aton()函数。
  2>函数形参:const  char*cp:cp指向字符串形式的IP地址。
  3>函数返回值:函数成功后返回二进制的网络字节序的IP地址(struct in_add),否则返回-1. 4>inet_addr计算出来的是网络字节序的二进制IP 5>函数实例:#include<stdio.h> #include<stdlib.h> #include<string.h>
  #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> int main()
  { char buffer[32];structin_addr in;in.s_addr =0;/*输入一个字符串形式的IP地址*/ printf(“pleaseinput the ip addrss\n”);scanf(“%s”,buffer);buffer[31]=‘\0’;printf(“original IPaddress:%s\n”,buffer);if((in.s_addr = inet_addr(buffer))==INADDR_NONE){ perror(“inet_addr”);exit(1);}  else  { printf(“after transfer:0x%0x\n”,in.s_addr);} 4.inet_network in_addr_t  inet_network(constchar *cp)
  1>函数作用:将参数cp指向的字符串形式的网络地址转换为主机字节顺序形式的二进制IP地址。
  2>函数形参?  const char *cp: cp指向字符串形式的IP地址。
  3>函数返回值:执行成功后返回转换后的结果,参数无效后返回-1. 4>inet_network返回的是主机字节序5>函数实例:#include<stdio.h> #include<stdlib.h> #include<string.h>
  #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> int main()
  { char buffer[32];structin_addr in;in.s_addr =0;/*输入一个字符串形式的IP地址*/

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • /etc/fstab 详解
      • nginx主主集群
      •  LVS-NAT和LVS-DR模式的实现详解
      •  RHCE考试之磁盘配额
      • 学习笔记:ACL详解
      • suse linux双网卡双网关配置
      •  LVM逻辑卷管理器
      •  Nginx主主负载均衡架构
      • ubuntu学习Mysql

      快速直达

      操作系统导航

      LinuxWindows虚拟机
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1