支持ipv6的windows套接字变化

上传人:wt****50 文档编号:37848509 上传时间:2018-04-23 格式:DOCX 页数:8 大小:89.42KB
返回 下载 相关 举报
支持ipv6的windows套接字变化_第1页
第1页 / 共8页
支持ipv6的windows套接字变化_第2页
第2页 / 共8页
支持ipv6的windows套接字变化_第3页
第3页 / 共8页
支持ipv6的windows套接字变化_第4页
第4页 / 共8页
支持ipv6的windows套接字变化_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《支持ipv6的windows套接字变化》由会员分享,可在线阅读,更多相关《支持ipv6的windows套接字变化(8页珍藏版)》请在金锄头文库上搜索。

1、支持支持IPV6的的WINDOWS套接字套接字变变化化发布: 2008-11-17 18:29 | 作者: admin | 来源: IPv6之家1、增加的常量IPV6的地址族名和协议族名常为:AF_INET6 PF_INET62、地址数据结构struct in6_addr uint8_t s6_addr16; /* IPv6 address */;sockadd_in6用于包含一个IPV6地址struct sockaddr_in6 short sin6_family; /* AF_INET6 */u_short sin6_port; /* Transport level port number

2、 */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中sockadd

3、r和IPV6中sockaddr_in6具有不同的长度,因此,不能使用structsockaddr来分配存储空间,然后将其强制转换为一个sockaddr_in6指针。如果需要为sockaddr_in6结构静态分配存储空间,则应该使用struct sockaddr_storage,例如:struct sockaddr_storage newaddr;.msgsock=accept(listen_socket,(struct sockaddr *)3、通配地址为了在具体的实现方案中为使用IPV4的连接或数据报选择一个源地址,在bind()函数调用中将常量INADDR_ANY用作地址。IPV6地址类型

4、(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)在赋值中使用,常量(IN6A

5、DDR_LOOPBACK_INIT)用于在声明时的初始化。注意,IPV4的INADDR_XXX常量以主机字节顺序定义,而IPV6的以网络字节顺序定义4、核心套接字函数在核心套接字函数中所进行的地址传递实际上是传递一个不透明的地址指针和长度,因此,IPV6的核心套接字函数不需要对原来的进行改变。我们只需要简单地提供适当的IPV6地址结构和族常量。接受地址参数的套接字函数有:bind()connect()sendmsg()sendto()返回地址的套接字函数有:accept()recvfrom()recvmsg()getpeername()getsockname()5、名称到地址的转换在IPV4中

6、,应用程序使用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 *re

7、s);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_t ai_addrlen; /* length of ai_addr */char *ai_canonname; /* canonical name for nodename */struct sock

8、addr *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

9、 FAR *serv,IN size_t servlen,IN int flags);我们在编程时可以这样使用getaddrinfo()函数:.if (getaddrinfo(service_name,port,NULL,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(),这两个

10、函数是与协议无关的,但XP和SERVER2003不支持这两个函数,而用getaddrinfo()和getnameinfo()来代替8、套接字选项在IPV6专用的套接字选项中,定义了一个新的套接字选项级别IPPROTO_IPV6。新的套接字选项如下:IPV6_MULTICAST_IF:将自内向外的多播通信流所使用的默认接口设置为由参数所指定的索引所表示的接口(0表示由系统选择接口)IPV6_MULTICAST_HOPS:根据参数来设置自内向外的多播数据包的跳限制。有效值在-1255之间,其中-1表示使用系统的默认值IPV6_MULTICAST_LOOP:用于控制目标为一个多播组的自内向外的多播数

11、据包是否被环回。对于多揪播通信流的接收,IPV6定义了新的选项来加入或离开一个多播组。这些选项使用ipv6_mreq结构作为参数。struct ipv6_mreqstruct in6_addr ipv6mr_multiaddr;unsigned int ipv6mr_interface;新的多播套接字选项有:IPV6_JOIN_GROUP:用于加入指定接口上的指定多播组(0表示由系统来选择接口)IPV6_LEAVE_GROUP:用于离开指定接口上的指定多播组。另外,还有一个套接字选IPV6_UNICAST_HOPS来控制自内向外的单播数据包的跳限制。9、新的宏为支持IPV6而新加入到WINDO

12、WS套接字中的还有以下的宏集合,这些宏用于测试地址,并确定它们是否为特殊的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_

13、GLOBAL如果地址是指定的类型,则前7个宏返回值为真。后5个宏用于测试多播地址的范围,如果地址是指定范围的多播地址,则返回值为真;如果地址不是多播地址,或者不在指定的范围之内,则返回值为假。IN6_IS_ADDR_V4MAPPED宏可用于确定套接字的目标地址是否是一个IPV4节点。XP和SERVER2003系列的IPV6地址不支持IPV4映射地址。10、不受支持的APIXP和SERVER2003系列的IPV6协议不支持的API包括:getipnodebyname(),getipnodebyaddr(),inet_pton(),inet_ntop()有一系列的名称/接口索引转换不被支持,但可能以后支持。更多信息请参考:RFC2553,RFC2292

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号