getaddrinfo()

//getaddrinfo()函数原型
WINSOCK_API_LINKAGE
INT
WSAAPI
getaddrinfo(
    _In_opt_        PCSTR               pNodeName,    //节点名可以是主机名,也可以是数字地址。(IPV4的10进点分,或是IPV6的16进制)
    _In_opt_        PCSTR               pServiceName, //包含十进制数的端口号或服务名如(ftp,http)
    _In_opt_        const ADDRINFOA *   pHints,       //是一个空指针或指向addrinfo结构的指针,由调用者填写关于它所想返回的信息类型的线索
    _Outptr_        PADDRINFOA *        ppResult      //存放返回addrinfo结构链表的指针
    );
//调用该函数会获得一个addrinfo结构的列表,调用的返回值是addrinfo的结构(列表)指针。


//addrinfo结构原型typedef struct addrinfo
{
    int                 ai_flags;       // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
    int                 ai_family;      // PF_xxx  ,AF_INET,AF_INET6,AF_UNSPEC
    int                 ai_socktype;    // SOCK_xxx ,SOCK_STREAM,SOCK_DGRAM
    int                 ai_protocol;    // 0 or IPPROTO_xxx for IPv4 and IPv6 ,IPPROTO_IP, IPPROTO_IPV4, IPPROTO_IPV6 etc.
    size_t              ai_addrlen;     // Length of ai_addr
    char *              ai_canonname;   // Canonical name for nodename
    _Field_size_bytes_(ai_addrlen) struct sockaddr *   ai_addr;        // Binary address
    struct addrinfo *   ai_next;        // Next structure in linked list
}
ADDRINFOA, *PADDRINFOA;

由getaddrinfo返回的所有存储空间都是动态获取的,这些存储空间必须通过调用freeaddrinfo返回给系统。

//freeaddrinfo()函数原型WINSOCK_API_LINKAGE
VOID
WSAAPI
freeaddrinfo(
    _In_opt_        PADDRINFOA      pAddrInfo
    );
//getaddrinfo()函数示例

char host_name[20] = "";
 gethostname(host_name, 20);

ADDRINFOA hint, *pAddrinfo;
 memset(&hint, 0, sizeof(ADDRINFOA));
 hint.ai_family = AF_INET;
 hint.ai_socktype = SOCK_STREAM;
 hint.ai_protocol = IPPROTO_TCP;
 hint.ai_flags = AI_PASSIVE;
 int ret = getaddrinfo(host_name, "3050", &hint, &pAddrinfo);
 if (ret!=0)
 {
  AfxMessageBox(_T("获得主机IP失败"));
  return;
 }

SOCKET socket_server = socket(pAddrinfo->ai_family, pAddrinfo->ai_socktype, pAddrinfo->ai_protocol);
 bind(socket_server, pAddrinfo->ai_addr, pAddrinfo->ai_addrlen);

时间: 2024-11-03 05:30:04

getaddrinfo()的相关文章

运用 getaddrinfo()函数的简单服务器实现

一.getaddrinfo()函数简介 getaddrinfo() 函数:提供独立于协议的名称解析. 函数原型: getaddrinfo() 函数使用前通常需要对以下 6 个参数进行设置: nodename.servname.hints 的 ai_flags.ai_family.ai_socktype.ai_protocol. 以上在 6 项参数中,对函数影响最大的是nodename,sername 和 hints.ai_flag:ai_family 只有地址为IPv4或IPv6的区别:ai_p

reverse mapping checking getaddrinfo for bogon failed – POSSIBLE BREAK-IN ATTEMPT! 错误

今天做ssh脚本查询远程服务器运行时间登录报了一个 reverse mapping checking getaddrinfo for bogon failed – POSSIBLE BREAK-IN ATTEMPT! 错误,但不影响登录.可是看着不顺眼,查查资料解决它, 原因:ssh 登录的时候会做一系列安全检查,其中有一项是 主机名与ip地址是否能解析,如果解析不了就会报这个错误.如果你有dns服务器 ,在服务器上做解析也行.总之,ping主机名必须解析到对应的ip地址, 解决方法一: 在/e

getaddrinfo()函数详解-(转自 cxz2009)

1. 概述 IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间.IPv6中引入了getaddrinfo()的新API,它是协议无关的,既可用于IPv4也可用于IPv6.getaddrinfo函数能够处理名字到地址以及服务到端口这两种转换,返回的是一个addrinfo的结构(列表)指针而不是一个地址清单.这些addrinfo结构随后可由套接口函数直接使用.如此以来,g

getaddrinfo()详解

IPv4中使用gethostbyname()函数完成主机名到地址解析,但是该API不允许调用者指定所需地址类型的任何信息,返回的结构只包含 了用于存储IPv4地址的空间.为了解决该问题,IPv6中引入了getaddrinfo()的新API,它是协议无关的,既可用于IPv4也可用于 IPv6.调用该函数会获得一个addrinfo结构的列表,调用的返回值是addrinfo的结构(列表)指针. 本文结合在WinowsXP和Windows2003 Server上使用该函数的经验,对getaddrinfo

socket模块的getaddrinfo方法详解

getaddrinfo方法用于通过url解析dns import sys,socket def dns_resolver(url): result = socket.getaddrinfo(url, None) print(result[0][4][0]) if __name__ == '__main__': dns_resolver('www.baidu.com') socket.getaddrinfo(host, port[, family[, socktype[, proto[, flag

Getaddrinfo()笔记

WSADATA dwRetval; if (WSAStartup(MAKEWORD(2,2),&dwRetval)!=0) //开启Socket { printf("WSAStartup failed.\n"); return 1; } void CGetHostNameDlg::OnGetHostNameIP(){ char   szHostname[128]; char   *ipName = new char[16]; //存放IP struct addrinfo   *

heroku create ENOTFOUND: getaddrinfo ENOTFOUND api.heroku.com api.heroku.com:443

$heroku create出现下面的错误: Creating app... !!! ? ENOTFOUND: getaddrinfo ENOTFOUND api.heroku.com api.heroku.com:443 2016/03/17 15:20:05 Error: getaddrinfo ENOTFOUND api.heroku.com api.heroku.com:443 at errnoException (dns.js:26:10) at GetAddrInfoReqWrap.

gethostbyname() 及 getaddrinfo() 用法探究

主要是如何使用两个函数的返回结构.在gethostbyname函数中,返回hostent,linux参考手册介绍如下: struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of address */ char **h_addr_list

getaddrinfo()函数详解

1. 概述 IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间.IPv6中引入了getaddrinfo()的新API,它是协议无关的,既可用于IPv4也可用于IPv6.getaddrinfo函数能够处理名字到地址以及服务到端口这两种转换,返回的是一个addrinfo的结构(列表)指针而不是一个地址清单.这些addrinfo结构随后可由套接口函数直接使用.如此以来,g