首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

Winsock中姓名解析和地址解析

2013-10-28 
Winsock中名称解析和地址解析随着IPv6添加了两个既能解析IPv4又能解析IPv6的函数:getnameinfo和getaddrinf

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

热点排行