C++辅导:IPv6网络程序设计
来源:优易学  2011-10-9 18:42:09   【优易学:中国教育考试门户网】   资料下载   IT书店

 IPv4 最初是由美国国防部开发的用于网际互联(IP)协议,后来它不仅发展了TCP,而且还进一步发展了IPv4(IP 协议4.0版)。IPv4现在已经广泛应用于Internet网络中,同时也应用于大多数计算机系统,局域网和广域网中。然而,随着Internet 中的计算机数量突飞猛涨,IPv4 的局限性越发明显:
  1.IPv4地址数目面临耗尽,日近紧张;
  2.IPv4寻址并非完全分等级,这使得Internet 枢纽路由器必须维持大量的路由表,负担过重。
  3.IPv4的地址必须被静态分配或通过配置协议(如:DHCP)进行分配。IPv6的开发目标之一就是将提供更为简便的配置方案。
  于是IPv6(6.0版本)应运而生。在Window系统中,Windows XP 提供了IPv6的developer-release版本;Windows 2000也可在http://www.microsoft.com/ipv6 下载 IPv6协议预览。 
  一.IPv4地址及其寻址
  1.IPv4地址
  IPv4地址(常称IP地址)用一个32位数表示;通常表示位十进制格式,地址的每8位字节被表示转为一个十进制的数值,并由句点分隔,如:192.168.0.1;IPv4地址 通常分为A、B、C、D、E 五类。
  2.IPv4寻址
  在Winsock 中,通过SOCKADDR_IN 结构来指定IPv4的地址和服务断口信息:
  struct sockaddr_in {
  short sin_family ;//必须为AF_INET,表示使用IPv4地址簇
  u_short sin_port; //TCP/UDP 端口
  struct in_addr sin_addr;// IP地址(以网络字节顺序排列, 4个字节)
  char sin_zero[8];//填充项
  }
  二.IPv6地址及其寻址
  1.IPv6地址
  IPv6地址与IPv4地址的显著的不同是128位,长度是IPv4地址的4倍。IPv6地址由16位字节分段表示,显示为冒号分隔的十六进制:
  21DA:00D3:0000:2F3A:B234:ED12:9C5A:DAC3
  IPv6地址的分配
  分配
  地址前缀
  保留地址0000 0000
  为NSAP预留0000 0001
  可聚合的全球单播地址001
  链接-本地单播地址1111 1110 10
  站点-本地单播地址1111 1110 11
  多播地址1111 1111
  2. IPv6的寻址
  Winsock中,寻址使用一下结构:
  structsockaddr_in6{
  short sin6_family;// 地址簇:AF_INET6
  u_short sin6_port;//端口号
  u_long sin6_flowinfo;//连接标记通信量
  struct in6_addr sin6_addr;//16字节结构的IPv6 地址
  u_long sin6_scope_id;//地址所有的接口索引
  }
  三.独立于协议的地址及名称解析
  由此可见在寻址时,IPv4使用16字节的SOCK_ADDR_IN 结构,IPv6则使用28 字节的SOCK_ADDR_IN6 结构。为了解决这个问题,IPv6中引入了新的寻址函数。

  1.getaddrinfo(),它提供独立于协议的名称解析:
  int getaddrinfo(
  const char *FAR *nodename,
  constchar FAR* servname,
  const struct addrinfo FAR *hins,
  struct addrinfo FAR *FAR *res
  );
  第一参数:nodename,以空字节结束的主机名或文字地址
  第二参数:servname,包含端口或服务名(如:FTP,TELNET)的以空字节结束的字符串
  第三个参数:hins 是一个结构(addrinfo),包含名称解析的执行方式选项
  第四个参数:res ,用于返回 addrinfo 结构的一个或多个链表
  结构addrinfo 的定义:
  structaddrinfo{
  int ai_flags;
  int ai_family;
  int ai_socktype;
  int ai_protocol;
  size_t ai_addrlen;
  char *ai_cannoname;
  struct sockaddr *ai_addr;
  struct addrinfo *ai_next;
  }
  ai_flags 选值:AI_PASSIVE:可以用来获取能够传递给bind函数的地址,此时nodename应设置为NULL,servname为欲绑定的端口;AI _CANONNAME 表示nodename 是主机名;AI_NUMBERICHOST 表示, nodename 是一个文字字符串地址(如:“192.168.0.1”)
  ai_family 选值:AI_INET或PF_INET(IPv4地址簇);AI_INET6或PF_INET6(IPv6地址簇);AI_UNSPEC(未指定,可能是IPv4或IPv6 地址簇)
  ai_socktype选值:SOCK_DGRAM(UDP类型套接字);SOCK_STREAM (TCP类型套接字)
  ai_protocol 选值:IPPROTO_TCP (TCP/IP协议)
  如果函数解析成功,解析后的地址将通过res返回。如果名称被解析为多个地址,则返回一个由ai_next 字段形成的链表。每个由名称解析的地址在ai_addr中表示,长度在ai_addrlen中表示。
  2.getnameinfo()函数与getaddrinfo()相对应,功能相反。
  .int getnameinfo(
  const struct sockaddr FAR *sa,
  socklen_t salen,

[1] [2] [3] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训