getaddrinfo函数
gethostbyname和gethostbyaddr這兩個函數僅僅支持IPv4,getaddrinfo函數能夠處理名字到地址以及服務到端口這兩種轉換,返回的是一個sockaddr結構的鏈表而不是一個地址清單。這些sockaddr結構隨后可由套接口函數直接使用。如此一來,getaddrinfo函數把協議相關性安全隱藏在這個庫函數內部。應用程序只要處理由getaddrinfo函數填寫的套接口地址結構。
該函數在 POSIX規范中定義了
?
平臺:VS2017
?
#include "pch.h"
 #define _CRT_SECURE_NO_WARNINGS?? ??? ?
 #include <winsock2.h>
 #include <ws2tcpip.h>
 #include <stdio.h>
 ?? ?
#pragma comment (lib, "Ws2_32.lib")
int ?main(int argc, char **argv)
 {
 ?? ?WORD wVersion;
 ?? ?WSADATA WSAData;
 ?? ?wVersion = MAKEWORD(2, 2);
 ?? ?WSAStartup(wVersion, &WSAData);
 ?? ?struct addrinfo hints;
 ?? ?struct addrinfo *res, *cur;
 ?? ?int ret;
 ?? ?struct sockaddr_in *addr;
 ?? ?char m_ipaddr[16];
?? ?memset(&hints, 0, sizeof(struct addrinfo));
 ?? ?hints.ai_family = AF_INET; ? ? /* Allow IPv4 */
 ?? ?//hints.ai_flags = AI_PASSIVE;/* For wildcard IP address */
 ?? ?hints.ai_flags = 0;/* For wildcard IP address */
 ?? ?hints.ai_protocol = 0; ? ? ? ? /* Any protocol */
 ?? ?hints.ai_socktype = SOCK_STREAM;
?? ?ret = getaddrinfo("www.baidu.com", NULL, &hints, &res);
?? ?if (ret == -1)?
 ?? ?{
 ?? ??? ?perror("getaddrinfo");
 ?? ??? ?exit(1);
 ?? ?}
 ?? ?for (cur = res; cur != NULL; cur = cur->ai_next)?
 ?? ?{
 ?? ??? ?addr = (struct sockaddr_in *)cur->ai_addr;
 ?? ??? ?sprintf(m_ipaddr, "%d.%d.%d.%d",
 ?? ??? ??? ?(*addr).sin_addr.S_un.S_un_b.s_b1,
 ?? ??? ??? ?(*addr).sin_addr.S_un.S_un_b.s_b2,
 ?? ??? ??? ?(*addr).sin_addr.S_un.S_un_b.s_b3,
 ?? ??? ??? ?(*addr).sin_addr.S_un.S_un_b.s_b4);
 ?? ??? ?printf("%s\n", m_ipaddr);
 ?? ?}
 ?? ?freeaddrinfo(res);
 ?? ?return 0;
 }
 ?
總結
以上是生活随笔為你收集整理的getaddrinfo函数的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: MQTT协议通俗讲解
- 下一篇: 获取本机主机名称和IP地址
