支持IPV6的WINDOWS套接字变化.docx_第1页
支持IPV6的WINDOWS套接字变化.docx_第2页
支持IPV6的WINDOWS套接字变化.docx_第3页
支持IPV6的WINDOWS套接字变化.docx_第4页
支持IPV6的WINDOWS套接字变化.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

支持IPV6的WINDOWS套接字变化发布: 2008-11-17 18:29 | 作者: admin | 来源: IPv6之家1、增加的常量IPV6的地址族名和协议族名常为:AF_INET6PF_INET62、地址数据结构struct in6_addr uint8_ts6_addr16; /* IPv6 address */;sockadd_in6用于包含一个IPV6地址struct sockaddr_in6 short sin6_family; /* AF_INET6 */ u_short sin6_port; /* Transport level port number */ u_long sin6_flowinfo; /* IPv6 flow information */ struct in_addr6 sin6_addr; /* IPv6 address */; 除了族、端口和地址信息,此结构中还包含sin6_flowinfo和sin6_scope_id数据成员。在数据成员sin6_flowinfo中将包含IPV6报头中的通信流类别字段和流标签字段。在XP和SERVER2003系统中不支持sin6_flowinfo数据成员。在数据成员sin6_scope_id中包含了范围ID,它用于标识一系列的接口,这些接口与地址字段中的地址相对应 由于IPV4中sockaddr和IPV6中sockaddr_in6具有不同的长度,因此,不能使用structsockaddr来分配存储空间,然后将其强制转换为一个sockaddr_in6指针。如果需要为sockaddr_in6结构静态分配存储空间,则应该使用struct sockaddr_storage,例如:struct sockaddr_storage newaddr;.msgsock=accept(listen_socket,(struct sockaddr *)&newaddr,&newaddrlen);3、通配地址 为了在具体的实现方案中为使用IPV4的连接或数据报选择一个源地址,在bind()函数调用中将常量INADDR_ANY用作地址。 IPV6地址类型(in6_addr)是一个结构变量,不能用常量为结构变量赋值,但常量可以用于初始化这个结构,全球变量in6addr_any可以在赋值中使用,如sin6.sin6_addr=in6addr_any; 或者常量IN6ADDR_ANY_INIT也可用于初始化地址结构(只在声明的时候),如struct in6_addr anyaddr=IN6ADDR_ANY_INIT; 在IPV4中的connect(),send()和sendmsg()函数调用中,使用常量INADDR_LOOPBACK来和本地节点中的服务进行通信。对于IPV6的回环,全局变量(in6addr_loopback)在赋值中使用,常量(IN6ADDR_LOOPBACK_INIT)用于在声明时的初始化。注意,IPV4的INADDR_XXX常量以主机字节顺序定义,而IPV6的以网络字节顺序定义4、核心套接字函数 在核心套接字函数中所进行的地址传递实际上是传递一个不透明的地址指针和长度,因此,IPV6的核心套接字函数不需要对原来的进行改变。我们只需要简单地提供适当的IPV6地址结构和族常量。接受地址参数的套接字函数有:bind()connect()sendmsg()sendto()返回地址的套接字函数有:accept()recvfrom()recvmsg()getpeername()getsockname()5、名称到地址的转换 在IPV4中,应用程序使用gethostbyname()函数来将主机名解析为一个或多个IP地址,但它不允许调用者指定所需地址类型的任何信息,因此IPV6中引入一个名字getaddrinfo()的新API,此API与协议无关,此调用的返回值是addrinfo的结构指针,以后可用它来打开和使用套接字,getaddrinfo()原型如下:int getaddrinfo( IN const char FAR *nodename, IN const char FAR *servname, IN const struct addrinfo FAR *hints, OUT struct adrinfo FAR *FAR *res );struct addrinfo int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */ int ai_family; /* PF_xxx */ int ai_socktype;/* SOCK_xxx */ int ai_protocol;/* 0 or IPPROTO_xxx for IPv4 and IPv6 */ size_tai_addrlen; /* length of ai_addr */ char *ai_canonname; /* canonical name for nodename */ struct sockaddr*ai_addr; /* binary address */ struct addrinfo*ai_next; /* next structure in linked list */;6、地址到名称的转换 反向查找可以通过使用另一个新的套接字函数getnameinfo()来进行,为使用此API,调用者需要提供一个套接字地址结构。getnameinfo()原型如下:int getnameinfo( IN const struct sockaddr FAR *sa, IN socklen_t salen, OUT char FAR *host, IN size_t hostlen, OUT char FAR *serv, IN size_t servlen, IN int flags ); 我们在编程时可以这样使用getaddrinfo()函数:.if (getaddrinfo(service_name,port,NULL,&ai)!=0) /*error handling */conn_socket=socket(ai-ai_family,ai-ai_socktype,ai-ai_protocol);if(conn_socketai_addr,ai-ai_addrlen)=SOCKET_ERROR) /*error handling*/freeaddrinfo(ai);7、地址转换函数 IPV4中使用inet_addr()和inet_ntoa()函数在IPV4地址的二进制格式和文本格式之间进行转换,IETF也定了相似的函数inet_pton()和inet_ntop(),这两个函数是与协议无关的,但XP和SERVER2003不支持这两个函数,而用getaddrinfo()和getnameinfo()来代替8、套接字选项 在IPV6专用的套接字选项中,定义了一个新的套接字选项级别IPPROTO_IPV6。新的套接字选项如下:IPV6_MULTICAST_IF:将自内向外的多播通信流所使用的默认接口设置为由参数所指定的索引所表示的接口(0表示由系统选择接口)IPV6_MULTICAST_HOPS:根据参数来设置自内向外的多播数据包的跳限制。有效值在-1255之间,其中-1表示使用系统的默认值IPV6_MULTICAST_LOOP:用于控制目标为一个多播组的自内向外的多播数据包是否被环回。 对于多揪播通信流的接收,IPV6定义了新的选项来加入或离开一个多播组。这些选项使用ipv6_mreq结构作为参数。struct ipv6_mreq struct in6_addr ipv6mr_multiaddr; unsigned int ipv6mr_interface; 新的多播套接字选项有:IPV6_JOIN_GROUP:用于加入指定接口上的指定多播组(0表示由系统来选择接口)IPV6_LEAVE_GROUP:用于离开指定接口上的指定多播组。 另外,还有一个套接字选IPV6_UNICAST_HOPS来控制自内向外的单播数据包的跳限制。9、新的宏 为支持IPV6而新加入到WINDOWS套接字中的还有以下的宏集合,这些宏用于测试地址,并确定它们是否为特殊的IPV6地址:IN6_IS_ADDR_UNSPECIFIEDIN6_IS_ADDR_LOOPBACKIN6_IS_ADDR_MULTICASTIN6_IS_ADDR_LINKLOCALIN6_IS_ADDR_SITELOCALIN6_IS_ADDR_V4MAPPEDIN6_IS_ADDR_V4COMPATIN6_IS_ADDR_MC_NODELOCALIN6_IS_ADDR_MC_LINKLOCALIN6_IS_ADDR_MC_SITELOCALIN6_IS_ADDR_MC_ORGLOCALIN6_IS_ADDR_MC_GLOBAL 如果地址是指定的类型,则前7个宏返回值为真。后5个宏用于测试多播地址的范围,如果地址是指定范围的多播地址,则返回值为真;如果地址不是多播地址,或者不在指定的范围之内,则返回值为假。 IN6_IS_ADDR_V4MAPPED宏可用于确定套接字的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论