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