天天看点

5-2:名字与地址转换

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取得的那样.
           
5-2:名字与地址转换
- struct sockaddr_storage
是一个套接字地址结构,大小可容纳IPV4/IPV6/域套接字等各类型地址对象,且满足它们的对齐限制.
           

freeaddrinfo

5-2:名字与地址转换

getnameinfo

int getnameinfo(
	// 指向一个套接字地址结构
	const struct sockaddr* sockaddr,
	socklen_t addrlen,
	char *host,
	socklen_t hostlen,
	char *serv,
	socklen_t servlen,
	int flags);
           
5-2:名字与地址转换
- DNS提供了一种获取主机/网络信息的方式.
DNS不可用下通过配置文件获取主机/网络也是一种方式.
协议,服务信息总是从相应配置文件中获取
           

继续阅读