Winsock中名称解析和地址解析
随着IPv6添加了两个既能解析IPv4又能解析IPv6的函数:getnameinfo和getaddrinfo。这两个函数定义在头文件WS2TCPIP.H。
1.getaddrinfo
其提供独立于协议的名称解析。其定义如下:
int getaddrinfo( const char FAR *nodename, const char FAR *servrname, cosnt struct addrinfo FAR* hints, struct addrinfo FAR *FAR *res);nodename:以空字符结束的主机名和文字地址。servname:一个包含端口号或服务名的以空字符结束的字符串。hints:其实一个结构体,用于设置选项,包括解析方式。res:一个结构体,用于解析后返回值。如果名称被解析为多个地址,这返回结果为一个由ai_next字段形参的链表。每个由名称解析而来的地址在ai_addr中表示,其长度为ai_addrlen中给出的套接字地址结构的长度。返回值:成功,返回0,;失败返回Winsock错误。
addrinfo结构的定义如下:
struct addrinfo{ int ai_flags; int ai_family; int ai_socktype; int ai_protocal; size_t ai_addrlen; char *ai_canonname; struct sockaddr *ai_addr; struct addrinfo *ai_next; };ai_flags:其为AI_PASSIVE、AI_CANONNAME、AI_NUMERICHOST之一。AI_PASSIVE表示nodename是计算机名。AI_NUMERICHOST表示nodename是文字字符串地址。
2.getnameinfo
其将初始化的套接字地址结构解析为对应的主机名和服务名,与getaddrinfo相反。其定义如下:
int getnameinfo( const struct sockaddr FAR* sa, socklen_t salen, char FAR *host, DWORD hostlen, char FAR* serv, DWORD servlen, int flags);
sa:要解析的套接字地址结构。
salen:套接字地址结构的长度。
host:接收解析后主机名的缓冲区。
hostlen:接收主机名缓存区的大小。
serv:接收解析后服务或端口号的缓冲区。
servlen:serv缓冲区的大小。
flags:可为NI_NOFQDN、NI_NUMERICHOST、NI_NAMEREQD、NI_NUMERRICSERV、NI_DGRAM。其中NI_NOFQDN表示返回RDN;NI_NUMERICHOST表示返回字符串表示的地址;NI_NAMERQD表示地址如果不能解析为FQDN,这返回错误信息;NI_NUMERRICSERV表示将端口号作为一个字符串返回;NI_DGRAM表示将数据报服务从流服务中区分开来。
3.简单地址解析
将字符串地址结构解析为套接字结构:WSAStringToAddress。
将套接字结构转换为该地址字符串表示的一个映射:WSAAdressToString。
4.传统名称解析例程
将点分IPv4地址转换为3位无符号长整数:inet_addr
将IPv4网络地址转换为一个字符串:inet_ntoa
将主机名转换为网络IPv4地址:gethostbyname、WSAAsyncGetHostByName
将网络IPv4转换为主机名:gethostbyaddr、WSAAsyncGetHostByAddr
取消异步请求函数:WSACancelAsyncRequest
已知服务名称,获取端口:getservbyname、WSAAsyncGetServByName
已知端口,获取服务名称:getservbyport、WSAAsyncGetServByPort
将字符串协议转换为协议号:getprotobyname、WSAAsyncGetProtoByName
将协议号转换为字符串协议:getprotobynumber、WSAAsyncGetProtoByNumber