【版权申明】转载请附上出处链接
socket编程中getaddrinfo与getnameinfo
$man getaddrinfo
NAME
getaddrinfo, freeaddrinfo, gai_strerror - network address and service translation
SYNOPSIS
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int getaddrinfo(const char *node, const char *service,
const struct addrinfo *hints,
struct addrinfo **res);
void freeaddrinfo(struct addrinfo *res);
const char *gai_strerror(int errcode);
The addrinfo structure used by getaddrinfo() contains the following fields:
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen;
struct sockaddr *ai_addr;
char *ai_canonname;
struct addrinfo *ai_next;
};
getaddrinfo
给定标识远程主机的ip地址(即node)与端口(即service),getaddrinfo()返回一个或多个addrinfo结构体,每个结构都包含一个Internet地址,可以在对bind()或connect()的调用中指定。
需要注意的是:getaddrinfo()函数将geth-ostbyname()和getservbyname()函数提供的功能组合到单个接口中,但与后两个函数不同的是,getaddrinfo()是可重入的,允许程序消除IPv4对IPv6的依赖。
/**
* @param node,IP地址
* @param service,端口
* @param hints,保存了socket的类型以及地址族
*
* @return 返回一个或多个addrinfo结构体
*/
int getaddrinfo(const char *node, const char *service,
const struct addrinfo *hints,
struct addrinfo **res);
$man getnameinfo
NAME
getnameinfo - address-to-name translation in protocol-independent manner
SYNOPSIS
#include <sys/socket.h>
#include <netdb.h>
/**
* @param addr,输入参数。struct addrinfo中的struct sockaddr
* @param addrlen,输入参数。struct addrinfo中的socklen_t
* @param host,输出参数。IP地址
* @param hostlen,输入参数。告诉函数host的大小
* @param serv,输出参数。端口号
* @param servlen,输入参数。告诉函数servlen的大小
* @param flags,输入参数。告诉函数struct sockaddr的处理方式
*
* @return 返回零则成功。
*/
int getnameinfo(const struct sockaddr *addr, socklen_t addrlen,
char *host, socklen_t hostlen,
char *serv, socklen_t servlen, int flags);
getnameinfo()函数与getaddrinfo()相反:它以独立于协议的方式将套接字地址转换为相应的主机和服务。
它结合了gethostbyaddr()和getservbyport()的功能,但与这些函数不同的是,getnameinfo()是可重入的,允许编程消除IPv4对IPv6的依赖。