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地址