getaddrinfo function
The getaddrinfo function provides protocol-independent translation from an ANSI host name to an address.
int getaddrinfo(
PCSTR pNodeName,
PCSTR pServiceName,
ADDRINFOA *pHints,
PADDRINFOA *ppResult
);
pNodeName [in,可选]
指向NULL终止的ANSI字符串的指针,该字符串包含主机(节点)名称或数字主机地址字符串。对于Internet协议,数字主机地址字符串是点分十进制IPv4地址或IPv6十六进制地址。
pServiceName [in,可选]
指向NULL终止的ANSI字符串的指针,该字符串包含表示为字符串的服务名称或端口号。
服务名称是端口号的字符串别名。例如,“http”是由Internet工程任务组(IETF)定义的端口80的别名,作为Web服务器用于HTTP协议的默认端口。未指定端口号时,pServiceName参数的可能值在以下文件中列出:
%WINDIR%\ system32 \ drivers \ etc \ services
pHints [in,可选]
指向addrinfo结构的指针,提供有关调用程序支持的套接字类型的提示。
由pHints参数指向的addrinfo结构的ai_addrlen,ai_canonname,ai_addr和ai_next成员必须为零或NULL。否则,GetAddrInfoEx函数将失败,并返回WSANO_RECOVERY。
有关详细信息,请参阅备注。
ppResult [out]
指向一个或多个addrinfo结构的链接列表的指针,其中包含有关主机的响应信息。
Return:
成功返回零。失败返回一个非零的Windows Sockets错误代码,在Windows套接字错误代码中找到。
getaddrinfo函数返回的大多数非零错误代码映射到Internet工程任务组(IETF)建议中列出的一组错误。下表列出了这些错误代码及其WSA等效项。建议使用WSA错误代码,因为它们为Winsock程序员提供了熟悉且全面的错误信息。
使用gai_strerror函数根据getaddrinfo函数返回的EAI代码打印错误消息。 gai_strerror函数是为了符合IETF建议而提供的,但它不是线程安全的。 因此,建议使用传统的Windows Sockets函数,如WSAGetLastError。
Error code |
Meaning |
没有足够的内存来执行操作 |
|
使用与请求的协议不兼容的地址。如果不支持pHints参数指向的addrinfo结构的ai_family成员,则返回此错误。 |
|
提供了无效的参数。如果为pHints参数指向的addrinfo结构的ai_flags成员提供了无效值,则会返回此错误。 |
|
在此地址系列中不存在对指定套接字类型的支持。如果不支持pHints参数指向的addrinfo结构的ai_socktype成员,则返回此错误。 |
|
没有这样的主机是已知的。如果提供的参数的名称未解析或未提供pNodeName和pServiceName参数,则会返回此错误。 |
|
请求的名称有效,但未找到请求类型的数据 |
|
在数据库查找期间发生不可恢复的错误。如果发生名称解析中的不可恢复错误,则返回此错误。 |
|
在使用此函数之前必须发生成功的WSAStartup调用。 |
|
这通常是在主机名解析期间的临时错误,并且意味着本地服务器没有从权威服务器收到响应。当名称解析发生临时故障时,将返回此错误。 |
|
找不到指定的类。对于pHints参数指向的addrinfo结构的指定ai_socktype成员,不支持pServiceName参数。 |
getaddrinfo函数的调用者可以通过pHints参数指向的addrinfo结构提供关于支持的套接字类型的提示。当使用pHints参数时,以下规则适用于其关联的addrinfo结构:
ai_family的AF_UNSPEC值表示主叫方将只接受AF_INET和AF_INET6地址系列。注意,AF_UNSPEC和PF_UNSPEC是相同的。
ai_socktype的值为零表示调用者将接受任何套接字类型。
ai_protocol的值为零表示调用者将接受任何协议。
ai_addrlen成员必须设置为零。
ai_canonname成员必须设置为NULL。
ai_addr成员必须设置为NULL。
ai_next成员必须设置为NULL。
ai_family的AF_UNSPEC值表示调用者将接受任何协议系列。此值可用于返回pNodeName参数指向的主机名的IPv4和IPv6地址。在Windows Server 2003和Windows XP上,只有在本地计算机上安装了IPv6时才会返回IPv6地址。
pHints参数中提供的addrinfo结构中的其他值表示具体要求。例如,如果调用者仅处理IPv4并且不处理IPv6,则ai_family成员应设置为AF_INET。另一个例子,如果调用者仅处理TCP而不处理UDP,则ai_socktype成员应设置为SOCK_STREAM。
如果pHints参数是NULL指针,则getaddrinfo函数将其视为在pHint中的addrinfo结构已使用其ai_family成员设置为AF_UNSPEC并将所有其他成员设置为零的方式进行初始化。
在Windows Vista及更高版本中,当从服务调用getaddrinfo时,如果操作是用户进程调用服务的结果,则服务应模拟用户。这是为了允许正确实施安全。
getaddrinfo函数可以用于将IP地址的文本字符串表示转换为addrinfo结构,该结构包含用于IP地址和其他信息的sockaddr结构。要以这种方式使用,pNodeName参数指向的字符串必须包含IP地址的文本表示,并且pHints参数指向的addrinfo结构必须在ai_flags成员中设置AI_NUMERICHOST标志。
pNodeName参数指向的字符串可能包含IPv4或IPv6地址的文本表示。文本IP地址将转换为ppResult参数指向的addrinfo结构。返回的addrinfo结构包含IP地址的sockaddr结构以及有关IP地址的附加信息。要使此方法在Windows Server 2003和Windows XP上使用IPv6地址字符串,必须在本地计算机上安装IPv6协议。否则,返回WSAHOST_NOT_FOUND错误。
从动态分配释放地址信息
由ppResult参数指向的getaddrinfo函数返回的所有信息都是动态分配的,包括addrinfo结构指向的所有addrinfo结构,套接字地址结构和规范主机名字符串。成功调用此函数所分配的内存必须随后调用freeaddrinfo来释放。
The flag bits can be a combination of the following:
Flag Bits |
Description |
AI_PASSIVE |
设置AI_PASSIVE标志表示调用者打算在调用bind函数时使用返回的套接字地址结构。当设置AI_PASSIVE标志并且pNodeName是NULL指针时,套接字地址结构的IP地址部分对于IPv4地址设置为INADDR_ANY,对于IPv6地址设置为IN6ADDR_ANY_INIT。 当未设置AI_PASSIVE标志时,返回的套接字地址结构已准备好用于面向连接的协议的connect函数的调用,或者准备好对无连接协议的connect,sendto或send函数的调用。如果在这种情况下pNodeName参数是NULL指针,则套接字地址结构的IP地址部分将设置为环回地址。 |
AI_CANONNAME |
如果既不使用AI_CANONNAME,也不使用AI_NUMERICHOST,则getaddrinfo函数尝试解析。如果传递的是字符串getaddrinfo尝试转换字符串,并且如果传递主机名,getaddrinfo函数会尝试将该名称解析为一个地址或多个地址。 当设置AI_CANONNAME位时,pNodeName参数不能为NULL。否则,getaddrinfo函数将失败,并返回WSANO_RECOVERY。 当AI_CANONNAME位置1且getaddrinfo函数返回成功时,ppResult参数中的ai_canonname成员指向包含指定节点的规范名称的以NULL结尾的字符串。 注意当设置AI_CANONNAME标志时,getaddrinfo函数可以返回成功,但关联的addrinfo结构中的ai_canonname成员为NULL。因此,建议使用AI_CANONNAME标志包括测试关联addrinfo结构中的ai_canonname成员是否为NULL。 |
AI_NUMERICHOST |
当AI_NUMERICHOST位置1时,pNodeName参数必须包含非NULL数字主机地址字符串,否则返回EAI_NONAME错误。此标志阻止调用名称解析服务。 |
AI_NUMERICSERV |
当设置了AI_NUMERICSERV位时,pServiceName参数必须包含非NULL数字端口号,否则返回EAI_NONAME错误。此标志阻止调用名称解析服务。 AI_NUMERICSERV标志在Windows Vista及更高版本的Windows SDK上定义。 Microsoft提供程序不支持AI_NUMERICSERV标志。 |
AI_ALL |
如果设置了AI_ALL位,则会通过AI_V4MAPPED请求IPv6地址和IPv4地址。 AI_ALL标志在Windows Vista及更高版本的Windows SDK上定义。 Windows Vista及更高版本支持AI_ALL标志。 |
AI_ADDRCONFIG |
如果设置了AI_ADDRCONFIG位,则仅当配置了全局地址时,getaddrinfo才会解析。 如果指定了AI_ADDRCONFIG标志,则只有在本地系统上配置了IPv4地址时才会返回IPv4地址,并且只有在本地系统上配置了IPv6地址时才会返回IPv6地址。 IPv4或IPv6环回地址不被认为是有效的全局地址。 AI_ADDRCONFIG标志在Windows Vista及更高版本的Windows SDK上定义。 Windows Vista及更高版本支持AI_ADDRCONFIG标志。 |
AI_V4MAPPED |
如果设置了AI_V4MAPPED位,并且对IPv6地址的请求失败,则对IPv4地址进行名称服务请求,这些地址将转换为IPv4映射IPv6地址格式。 AI_V4MAPPED标志在Windows Vista及更高版本的Windows SDK上定义。 Windows Vista及更高版本支持AI_V4MAPPED标志。 |
AI_NON_AUTHORITATIVE |
如果设置了AI_NON_AUTHORITATIVE位,则NS_EMAIL命名空间提供程序返回权威和非权威结果。如果未设置AI_NON_AUTHORITATIVE位,则NS_EMAIL命名空间提供程序仅返回权威性结果。 AI_NON_AUTHORITATIVE标志在Windows Vista及更高版本的Windows SDK上定义。 AI_NON_AUTHORITATIVE标志在Windows Vista及更高版本上受支持,并且仅适用于NS_EMAIL命名空间。 |
AI_SECURE |
如果设置了AI_SECURE位,NS_EMAIL命名空间提供程序将返回通过增强的安全性获得的结果,以尽可能减少可能的欺骗。 AI_SECURE标志在Windows Vista及更高版本的Windows SDK上定义。在Windows Vista和更高版本上支持AI_SECURE标志,并且仅适用于NS_EMAIL命名空间。 |
AI_RETURN_PREFERRED_NAMES |
如果设置了AI_RETURN_PREFERRED_NAMES,则pNodeName参数中不应提供任何名称。 NS_EMAIL命名空间提供程序将返回用于发布的首选名称。 AI_RETURN_PREFERRED_NAMES标志在Windows Vista及更高版本的Windows SDK上定义。 AI_RETURN_PREFERRED_NAMES标志在Windows Vista及更高版本上受支持,并且仅适用于NS_EMAIL命名空间。 |
AI_FQDN |
如果设置了AI_FQDN并且指定了平面名称(单个标签),getaddrinfo将返回名称最终解析为的完全限定域名。完全限定域名在关联addrinfo结构中的ai_canonname成员中返回。这与AI_CANONNAME位标记不同,后者返回在DNS中注册的规范名称,该名称可能与平面名称解析为的完全限定域名不同。只能设置AI_FQDN和AI_CANONNAME位中的一个。如果EAI_BADFLAGS同时存在这两个标志,getaddrinfo函数将失败。 当AI_FQDN位置1时,pNodeName参数不能为NULL。否则,GetAddrInfoEx函数将失败,并返回WSANO_RECOVERY。 Windows 7:AI_FQDN标志在Windows 7和更高版本的Windows SDK上定义。 Windows 7及更高版本支持AI_FQDN标志。 |
AI_FILESERVER |
如果设置了AI_FILESERVER,则这是命名空间提供程序的一个提示,即正在查询的主机名正在文件共享方案中使用。命名空间提供程序可以忽略此提示。 Windows 7:AI_FILESERVER标志在Windows 7和更高版本的Windows SDK上定义。 Windows 7及更高版本支持AI_FILESERVER标志。 |
注意确保开发环境目标为Ws2tcpip.h的最新版本,它们分别包括addrinfo和getaddrinfo的结构和函数定义。
具体参考:https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms738520(v=vs.85).aspx
getaddrinfo function的更多相关文章
- Getaddrinfo()笔记
WSADATA dwRetval; if (WSAStartup(MAKEWORD(2,2),&dwRetval)!=0) //开启Socket { printf("WSAStart ...
- Http压测工具wrk使用指南
用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...
- [工作积累] android 中添加libssl和libcurl
1. libssl https://github.com/guardianproject/openssl-android 然后执行ndk-build 2.libcurl 源代码组织结构, 下面的mak ...
- 记录一次配置unix网络编程环境的过程和遇到的问题
记录一次搭建unix网络编程环境过程中遇到的问题和总结 计算机环境虚拟机 linuxmint-18-xfce-64bit 1.打开unix网络编程.iso 把目录下的文件复制到某一目录,修改权限,可命 ...
- Http压测工具wrk使用指南【转】
用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...
- 性能测试工具 wrk 使用教程
文章首发自个人微信公众号:小哈学Java 个人网站地址:https://www.exception.site/wrk 被面试官经常问到之前开发的系统接口 QPS 能达到多少,经常给不出一个数值,支支吾 ...
- PostgreSQL源码安装文档
This document describes the installation of PostgreSQL using the source code distribution. (If yo ...
- 交叉编译python2.7.7
一.python下载网址: http://www.python.org/ftp/python/ 二.python的交叉编译依赖openssl ,openssl的下载网址: https://www.op ...
- c++下基于windows socket的单线程服务器客户端程序(基于TCP协议)
今天自己编写了一个简单的c++服务器客户端程序,注释较详细,在此做个笔记. windows下socket编程的主要流程可概括如下:初始化ws2_32.dll动态库-->创建套接字-->绑定 ...
随机推荐
- No.015:3Sum
问题: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0?Find all ...
- sso demo mysql ( cas )
基本配置 参考之前得随笔 http://www.cnblogs.com/rocky-fang/p/5354947.html 1. tomcat-cas 修改配置 1.1 在D:\test\sso\t ...
- 通过rsync+inotify实现数据实时备份同步
一.环境描述 测试环境 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 环境描述: 主服务器172.26.7.50 ,从 ...
- PDF.NET 开发框架之 SOD框架 Ver 5.2 正式版开源源码发布
PDF.NET 开发框架之 SOD框架 Ver 5.2.1.0307 正式版发布,包含以下部分: SOD_Pwmis.Core --包括下列数据提供程序 SqlServer SqlServerCe A ...
- 【转】从MVC到前后端分离
1. 理解MVC MVC是一种经典的设计模式,全名为Model-View-Controller,即模型-视图-控制器. 其中,模型是用于封装数据的载体,例如,在Java中一般通过一个简单的POJO(P ...
- 站长必备:10个好用的 WordPress 备份插件
网站备份对于站长来说极其重要的.任何的事情都可能发生,这可能会导致你失去所有的辛勤工作:您的网站可能被黑客攻破,你可以安装一个了插件导致冲突,你的服务器可能被攻击,你可能在编辑文件时犯了一个错误等等, ...
- 深入理解:JavaScript原型与继承
深入理解:JavaScript原型与继承 看过不少书籍,不少文章,对于原型与继承的说明基本上让人不明觉厉,特别是对于习惯了面向对象编程的人来说更难理解,这里我就给大家说说我的理解. 首先JavaScr ...
- Oracle基础和用户管理
1.数据库的使用: 项目的规模:负载量(用户)有多大? 成本: 安全性: (小型数据库)access.forbase 负载小 :100人以内,比如留言板,信息管理系统. 成本:千元以内. 安全性要 ...
- Javascript 面向对象编程初探(一)--- 封装
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果 ...
- Jquery属性获取——attr()与prop()
今天在项目中使用<select></select>下拉菜单时,使用juery操作,使页面加载完菜单默认选中的值为2,我一开始的操作如下: <!--html部分--> ...