getproductinfofailed是什么意思,python getaddrinfo failed
GetByName和gethostbyaddr函数仅支持IPv4。getaddrinfo函数可以处理名称到地址和服务到端口的转换,并返回sockaddr结构的链表而不是地址列表。然后,这些sockaddr结构可以被windows套接字函数直接使用。这样,getaddrinfo函数将协议依赖安全地隐藏在这个库函数内部。应用程序只需要处理getaddrinfo函数填充的windows sockets地址结构。POSIX规范中定义了这个函数。
1.addrinfo结构在头文件netdb.h中定义:
结构addrinfo{
int ai _ flags
int ai _ family//AF_INET、AF_INET6、UNIX等
int ai _ socktype//流、数据报、原始
int ai _ protocol//IP协议_IP、IP协议_IPV4、IP协议_IPV6等
size _ t ai _ addrlen//ai _ addr的长度
char * ai _ canonname//完整主机名
struct sockaddr * ai _ addr//主机的地址
struct addrinfo * ai _ next
};
2.Addrinfo参数typedef结构Addrinfo { Intai _ flagsint ai _ familyint ai _ socktypeint ai _ protocolsize _ t ai _ addrlenchar * ai _ canonnamestruct sockaddr * ai _ addrstruct addrinfo * ai _ next} ai_addrlen必须为零或空指针ai_canonname必须为零或空指针ai_addr必须为零或空指针ai_next必须为零或空指针可以更改参数ai _ flags: ai _ passive、ai _ canon name、ai _ numeric hostai _ family:af _ inet、af _ inet 6 ai _ sock type:sock _ stream、sock _ dgram ai _ protocol:IP proto _ IP、IP proto _ IPv4、IP proto
在getaddrinfo函数之前,通常需要设置以下六个参数:nodename、servname和hints的 ai_flags、ai_family、ai_socktype、ai_protocol。六个参数中,nodename、sername和hints.ai_flag对函数的影响最大,ai_family只有地址是IPv4还是IPv6的区别。ai_protocol一般设置为0,不变。其中ai_flags,ai_family,ai_socktype描述如下:参数值描述AI _ familiaf _ inet 2 IP v4 af _ inet 623 IP V6 af _ unspence c0协议独立AI _ protopoliproto _ ipv 4 IP v4 IP proto _ ipv 641 IP V6 IP proto _ UDP 17 udip Ppro to _ TCP 6 TCP AI _ Sock类型Sock _ Stream 1 Stream SOCK_DGRAM2数据报ai_flagsAI_PASSIVE1被动,用于
AI _ NUMERICHOSTAI _ CANONNAMEAI _ passive 0/10/10/1
如上表所示,ai_flags的取值范围从0到7,取决于程序如何设置这三个标志。例如,如果ai_flags设置为“AI_PASSIVEAI_CANONNAME”,则AI _ flags值将为3。三个参数的含义是:(1)AI_PASSIVE当这个标志被设置时,意味着调用者将在bind()函数调用中使用返回的地址结构。当没有设置这个标志时,意味着它将在connect()函数调用中使用。当节点名位为空且设置了该标志时,返回的地址将是通用地址。如果节点名为空且未设置该标志,则返回的地址将是环回地址。(2)AI_CANNONAME设置此标志时,函数返回的第一个addrinfo结构中的AI_CANNONAME成员应该包含一个以空字符结尾的字符串。字符串的内容是节点名称的正常名称。(3)AI_NUMERICHOST当该标志被置位时,该标志表示调用中的节点名必须是数字地址串。# includenetb . h intgetaddrinfo(const char*hostname,const char*service,const structaddrinfo*hints,structaddrinfo**result);
0:成功
0:错误
主机名:主机名或地址字符串(IPv4的点分十进制字符串或IPv6的十六进制字符串)
服务:服务名或一串十进制端口号。
提示:它可以是一个空指针,也可以是一个指向addrinfo结构的指针,在addrinfo结构中,调用者填写关于预期返回的信息类型的提示。例如,如果指定的服务同时支持TCP和UDP,调用方可以将提示结构中的ai_socktype成员设置为SOCK_DGRAM,以便只返回适用于数据报windows套接字的信息。
该函数通过结果指针参数返回addrinfo结构的链表指针,addrinfo结构在头文件netdb.h中定义:
如果这个函数成功返回,那么result参数指向的变量已经被一个指针填充,这个指针指向由它的ai_next成员串联起来的addrinfo结构链表。有两种情况会导致返回多个addrinfo结构:
1.如果有多个地址与hostname参数相关联,那么适用于所请求的地址簇的每个地址将返回相应的结构。
2.如果service参数指定的服务支持多种windows套接字类型,则每种windows套接字类型都可能返回相应的结构,具体取决于提示结构的ai_socktype成员。
我们必须首先分配一个提示结构,清除它并填充必需的字段,然后调用getaddrinfo,然后遍历一个链表,逐个尝试每个返回地址。
Getaddrinfo解决了将主机名和服务名转换成全套接口的地址结构的问题。
其中,如果getaddrinfo出错,将返回一个非零的错误值。
# includenetdb.h
const char * Gai _ strerror(int error);
该函数将getaddrinfo返回的非零错误值的名称和含义作为其唯一的参数,并返回指向相应错误信息字符串的指针。
getaddrinfo返回的所有存储空间都是动态获取的,这些存储空间必须通过调用freeaddrinfo返回给系统。
#包含netdb.h
void freeaddrinfo(struct addrinfo * ai);
ai参数应该指向getaddrinfo返回的第一个addrinfo结构。甚至这个表中的所有结构和它们指向的任何动态存储空间都被释放。
示例:
struct addrinfo * host _ serv(const char * host,const char *serv,int family,int socktype)
{
int n;
struct addrinfo提示,* res
bzero( hints,sizeof(struct addrinfo));
hints.ai _ flags=AI _ CANONNAME
hints.ai _ family=family
hints . ai _ sock type=sock type;
WSADATA dwRetval
if (WSAStartup(MAKEWORD(2,2),dwRetval)!=0)//初始化Winsock
{
printf(WSAStartup失败。\ n’);
返回1;
}
if( (n=getaddrinfo(主机,服务器,提示,资源))!=0 )
返回(NULL);
返回(RES);
}
可靠数据流
AF_UNSPEC为ip4和ip6
Getaddrinfo函数原型
参数描述int get addrinfo(const char * nodename const char * servname,conststruct addrinfo * hints,//struct addrinfo * * RES);Nodename:节点名可以是主机名或数字地址。(IPV4的小数点或IPV6的十六进制)servname:包含十进制数的端口号或服务名如(ftp,http)提示:是一个空指针或指向addrinfo结构的指针,调用者填入它要返回的信息类型的线索。Res: Getaddrinfo,存储返回addrinfo结构的链表的指针,提供了与协议无关的名称解析。
该函数的前两个参数分别是节点名和服务名。节点名可以是主机名或地址字符串(IPv4的点分十进制表示或IPv6的十六进制数字字符串)。服务名可以是十进制端口号或定义的服务名,如ftp、http等。注意:节点名和服务名是可选的,即节点名或服务名可以为空,默认会设置调用的结果,后面会详细讨论。函数的第三个参数提示是指向addrinfo结构的指针,调用者填写关于它想要返回的信息类型的线索。函数的返回值是一个指向addrinfo结构的链表指针res。转载于:https://www.cnblogs.com/yunqie/p/6101295.html
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。