基于C++中的IPv6网络程序设计
三.独立于协议的地址及名称解析
由此可见在寻址时,IPv4使用16字节的SOCK_ADDR_IN 结构,IPv6则使用28 字节的SOCK_ADDR_IN6 结构。为了解决这个问题,IPv6中引入了新的寻址函数。 [Page]
1.getaddrinfo(),它提供独立于协议的名称解析:
int getaddrinfo(
const char *FAR *nodenAME,
const char FAR* SERvname,
const struct addrinfo FAR *hins,
struct addrinfo FAR *FAR *res
);
l 第一参数:nodename,以空字节结束的主机名或文字地址
l 第二参数:servname,包含端口或服务名(如:FTP,TELNET)的以空字节结束的字符串
l 第三个参数:hins 是一个结构(addrinfo),包含名称解析的执行方式选项
l 第四个参数:res ,用于返回 addrinfo 结构的一个或多个链表
结构addrinfo 的定义:
struct addrinfo{
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;
}
l ai_flags 选值:AI_PASSIVE:可以用来获取能够传递给bind函数的地址,此时nodename应设置为NULL,servname为欲绑定的端口;AI _CANONNAME 表示nodename 是主机名;AI_NUMBERICHOST 表示, nodename 是一个文字字符串地址(如:“192.168.0.1”)
l ai_family 选值: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的网络程序,显然涉及到两个部分:客户机和服务器。
在Windows 网络编程中,Winsock是一种标准的API(应用程序接口),Winsock2版本已经发展成独立于协议的的接口,被广泛应用于Windows平台中。
评论