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是文字字符串地址。
    ai_family:可为AF_INET、AF_INET6、AF_UNSPEC。AF_INET解析到IPv4;AF_INET6解析到IPv6;AF_UNSPEC两种都有可能。
  • ai_socktype:指定套接字的类型,如SOCK_DGRAM和SOCK_STREAM。
  • ai_protocal:指定要要求的协议,如IPPROTO_TCP。
  • ai_addr:其为解析后的结构体
  • ai_addtlen:解析后的结构体的长度。
  • ai_next:如果被解析为多个地址,就形成链表,该参数指向下一个结构体。

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

你可能感兴趣的:(网络编程)