您好,登錄后才能下訂單哦!
1,使用 getaddrinfo 來 bind 或 connect
bind 和 connect 有了一種新方式,通過 getaddrinfo 返回適合 bind 和 connect 的地址,然后,通過遍歷列表,直到 bind 或 connect 成功,結束遍歷(參見 getaddrinfo說明中的例子)。
getaddrinfo 可以返回 ip4 和 ip6 地址。
即不再通過構造 sockaddr_in(6) 而是通過構造一個 addrinfo 來 bind 或 connect 了,也不用關心 ip 類型及結構體成員,不再做字節序轉換了。
struct addrinfo hints;
struct addrinfo *result = NULL, *rp = NULL;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
hints.ai_socktype = SOCK_STREAM; /* Datagram socket */
hints.ai_flags = AI_ADDRCONFIG;
//hints.ai_protocol = 0; /* Any protocol */
hints.ai_protocol = IPPROTO_TCP;
hints.ai_canonname = NULL;
hints.ai_addr = NULL;
hints.ai_next = NULL;
hints.ai_flags 取值 | 第一個參數的取值 | 返回列表的包含值 |
---|---|---|
包含AI_PASSIVE | NULL | INADDR_ANY和IN6ADDR_ANY_INIT,即 0.0.0.0 和 :: |
包含AI_PASSIVE | 192.168.1.1 | 192.168.1.1 |
不包含AI_PASSIVE | 192.168.1.1 | 192.168.1.1 |
不包含AI_PASSIVE | 127.0.0.1 | 127.0.0.1 |
不包含AI_PASSIVE | 0.0.0.0 | 0.0.0.0 |
當第一個參數不為NULL時,忽略AI_PASSIVE
當不包含AI_PASSIVE時,返回的是一個適合 connect,sendto,sendmsg的地址
2,通過 addrinfo 獲取 host 及 port
char host[NI_MAXHOST] = {0};
char port[NI_MAXSERV] = {0};
getnameinfo(hints.ai_addr,NI_MAXHOST,host,NI_MAXHOST,port,NI_MAXSERV,NI_NUMERICHOST|NI_NUMERICSERV);
3,ip4 和 ip6 的公共儲存結構體 sockaddr_storage
獲取 ip 地址信息時,可以先定義個 這種類型的變量儲存,支持 ip4 和 ip6,再通過 getnameinfo 來獲取 host 和 port
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。