快速业务通道

C++中的IPv6网络程序设计

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
AI_INET或PF_INET(IPv4地址簇);AI_INET6或PF_INET6(IPv6地址簇);AI_UNSPEC(未指定,可能是IPv4或IPv6 地址簇)

l ai_socktype选值:SOCK_DGRAM(UDP类型套接字);SOCK_STREAM (TCP类  型套接字)

l 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, [Page]
                char FAR *host,
              DWORD hostlen,
              char FAR *serv,
              DWORD servlen,
              Int flags);

以上参数的含义比较明显,不再一一说明。

3.释放函数:freeaddrinfo(res);

四、兼容IPv4和IPv6的网络程序设计

兼容IPv4和IPv6的网络程序,显然涉及到两个部分:客户机和服务器

在Windows 网络编程中,Winsock是一种标准的API(应用程序接口),Winsock2版本已经发展成独立于协议的的接口,被广泛应用于Windows平台中。

<一>客户机程序设计

对于客户机来说,不管是建立TCP/UDP 连接,它都应知道服务器的主机名或IP 地址,同时将服务器地址解析为IPv4或IPv6地址都可以,一般可以考虑一下步骤:

SOCKET s;
struct addrinfo,hints,*res=NULl ;
char *szRemoteAddress;//主机名或IP 地址
char *szRemotePort;//端口号
int rc;

1.用getaddrinfo() 函数解析地址。hins结构中 使用AF_UNSPEC标志,便可以获得地址簇类型(IPv4或IPv6)。

memset(&hintas,0,sizeof(hints));
hints.ai_family=AF_UNSPEC;
hints.ai_socktype=SOCK_STREAM;
hints.ai_protocol =IPPROTO_TCP;
rc=getaddrinfo(szRemoteAdddress,szRemotePort,&hints,&res);
if(rc==WSANO_DATA)
{// 无法解析,出错 
}

用返回的addrinfo结构中的ai_family,ai_socketype,ai_protocol字段来创建套接字。

s=socket(res->ai_family,ai_socktype,res->protocol );
if(s==INVALID_SOCKET)
{//创建套接字失败 
}

2.使用返回的addrinfo结构中的ai_addr来调用其他函数(connect(),send()等).。

rc==connect(s,res->ai_addr,res->addrlen);
if(rc==SOCKET_ERROR)
{//连接失败;
}
。。。//完成其他编程

<二>服务器程序设计

服务器程序设计,应考虑到IPv4和IPv6 都具有各自的堆栈;因此如果服务器希望能同时接受IPv4和IPv6的连接,就必须能同时创建IPv4和IPv6套接字;一般可以考虑一下步骤:

SOCKET socklisten[2];//监听Socket变量
char *szPort=”8080”;//监听端口
struct addinfo hints,*res=NULl ,*ptr=NULl ;
int rc,i=0;

1.  调用getaddrinfo()函数,该结构包含AI_PASSIVE,AF_UNSPEC标志,以及所需的套接字类型、协议及所需的本地端口(用来监听和接受数据等)。函数将返回的两个addrinfo结构,分别可用于IPv4和IPv6监听地址:[Page]

memset(&hints,0,sizeof(hints));
hints.ai_family=AF_UNSPEC;
hints.ai_socktype=SOCK_STREAM;
hints.ai_protocol =IPPROTO_TCP;
hints.ai_flags=AI_PASSIVE;
rc=getaddinfo(NULl ,szPort,&hints,&res);
if(rc!=0){//失败处理;}
ptr=res;

2. 用返回的addrinfo结构中的ai_family,ai_socketype,ai_protocol字段来创建套接字后;便可以使用addrinfo

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号