天天看點

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不可用下通過配置檔案擷取主機/網絡也是一種方式.
協定,服務資訊總是從相應配置檔案中擷取
           

繼續閱讀