getaddrinfo
int getaddrinfo(
// 主机名/点分形式的IPv4,Ipv6地址
const char* hostname,
// 服务名/服务端口号
const char* service,
// 可以为NULL
// 用于填入对期望返回信息类型的暗示
const struct addrinfo* hints,
struct addrinfo** result);
// getaddrinfo非0返回值作为参数,给出对应错误描述
const char* gai_strerror(int error);
struct addrinfo
{
// AI_PASSIVE 套接字用于被动打开
// AI_CANONNAME 返回主机的规范名字
// AI_NUMERICHOST hostname必须是地址串
// AI_NUMERICSERV service需为十进制端口号数串
// AI_V4MAPPED 要求返回IPV6但没有IPV6地址时,也允许返回IPV4地址[会被映射到IPV6地址]
// AI_ALL
// AI_ADDRCONFIG
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
char* ai_canonname;
socklen_t ai_addrlen;
struct sockaddr *ai_addr;
struct addrinfo *ai_next;
};
服务器进程使用getaddrinfo时,
一般只指定service,同时hints中指定AI_PASSIVE,这样返回的struct sockaddr结构中IP部分类似INADDR_ANY[IPV4]/IN6ADDR_ANY_INIT取得的那样.
客户进程使用getaddrinfo获取用于套接字创建及本地绑定目的时,
对主机名不设置下,同时hints中不含AI_PASSIVE,这样返回的struct sockaddr结构中IP部分类似0::1/127.0.0.1取得的那样.
- struct sockaddr_storage
是一个套接字地址结构,大小可容纳IPV4/IPV6/域套接字等各类型地址对象,且满足它们的对齐限制.
freeaddrinfo
getnameinfo
int getnameinfo(
// 指向一个套接字地址结构
const struct sockaddr* sockaddr,
socklen_t addrlen,
char *host,
socklen_t hostlen,
char *serv,
socklen_t servlen,
int flags);
- DNS提供了一种获取主机/网络信息的方式.
DNS不可用下通过配置文件获取主机/网络也是一种方式.
协议,服务信息总是从相应配置文件中获取