Winsock中名称解析和地址解析

85 篇文章 0 订阅
9 篇文章 1 订阅

随着IPv6添加了两个既能解析IPv4又能解析IPv6的函数:getnameinfo和getaddrinfo。这两个函数定义在头文件WS2TCPIP.H。

1.getaddrinfo

其提供独立于协议的名称解析。其定义如下:

[cpp]  view plain  copy
  1. int getaddrinfo(  
  2.    const char FAR *nodename,  
  3.    const char FAR  *servrname,  
  4.    cosnt struct addrinfo FAR* hints,  
  5.    struct addrinfo FAR *FAR *res  
  6. );  
  • nodename:以空字符结束的主机名和文字地址。
  • servname:一个包含端口号或服务名的以空字符结束的字符串。
  • hints:其实一个结构体,用于设置选项,包括解析方式。
  • res:一个结构体,用于解析后返回值。如果名称被解析为多个地址,这返回结果为一个由ai_next字段形参的链表。每个由名称解析而来的地址在ai_addr中表示,其长度为ai_addrlen中给出的套接字地址结构的长度。
  • 返回值:成功,返回0,;失败返回Winsock错误。

addrinfo结构的定义如下:

[html]  view plain  copy
  1. struct addrinfo  
  2. {  
  3.     int ai_flags;  
  4.     int ai_family;  
  5.     int ai_socktype;  
  6.     int ai_protocal;  
  7.     size_t ai_addrlen;  
  8.     char *ai_canonname;  
  9.     struct sockaddr *ai_addr;  
  10.     struct addrinfo  *ai_next;   
  11. };  
  • 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相反。其定义如下:

[cpp]  view plain  copy
  1. int getnameinfo(  
  2.    const struct sockaddr FAR* sa,  
  3.    socklen_t salen,  
  4.    char FAR *host,  
  5.    DWORD hostlen,  
  6.    char FAR* serv,  
  7.    DWORD servlen,  
  8.    int flags  
  9. );  

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值