c++DNS解析

socket方式
  • Sockect方式可以通过getaddrinfo(支持IPV4/IPV6),进行域名解析
  • 注意:getaddrinfo无法解决主机名localhost,获取IP地址的情况
  • getaddrinfo函数原型
int getaddrinfo( const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result );
  • 参数说明
  1. hostname 主机名或地址串
  2. service 服务名
  3. hints 可以是空指针,也可以是addrinfo结构体的指针。
  4. result,返回一个指向addrinfo结构体链表的指针
  5. 函数返回值:0成功,非0失败。
  • struct addrinfo 结构体
struct addrinfo {
	int	ai_flags;	/* AI_PASSIVE, AI_CANONNAME */
	int	ai_family;	/* AF_xxx */
	int	ai_socktype;	/* SOCK_xxx */
	int	ai_protocol;	/* 0 or IPPROTO_xxx for IPv4 and IPv6 */
	size_t	ai_addrlen;	/* length of ai_addr */
	char	*ai_canonname;	/* canonical name for hostname */
	struct sockaddr *ai_addr;	/* binary address */
	struct addrinfo *ai_next;	/* next structure in linked list */
};
  • getaddrinfo,支持IPV4,IPV6。gethostbyname函数不支持IPV6。另外这两个函数都是阻塞方式的。
  • 代码
// for linux
#include<netdb.h>

bool dnsLookup(std::string &server, std::string& serverIP)
{
    bool ret = false;
    serverIP = "";
    char ipStr[17];
    bzero(ipStr, 17);
    struct addrinfo hints;
    memset(&hints, 0, sizeof(struct addrinfo));
    // for ipv4
    hints.ai_family = AF_INET;
    hints.ai_protocol = NCCLOUD_IP_V4;

    struct addrinfo* result = NULL;
    INT isSuccess = getaddrinfo(server.getString(), NULL, &hints, &result);
    if (isSuccess != 0) {
        // no find
    }
    else {
        for (struct addrinfo *ptr = result; ptr != NULL; ptr = ptr->ai_next) {
            struct sockaddr_in* sa = (struct sockaddr_in*) ptr->ai_addr;
            if (NULL != sa) {
                inet_ntop(AF_INET, &sa->sin_addr.s_addr, ipStr, sizeof(ipStr));
                serverIP = ipStr;
                ret = true;
            }
            break;
       }
    }

    freeaddrinfo(result);
    return ret;
}
libcurl方式
  • 如果域名支持HTTP,可采用此方式
  • 代码
#include <curl/curl.h>

void dnsLookup()
{
    CURL *curl;
    curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
    // 一些其他的配置,比如超时设置等

    CURLcode res;  
    res = curl_easy_perform(curl);
    
    char *ip = NULL;
    if((res == CURLE_OK) &&
        !curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP, &ip) && ip) {
        printf("IP: %s\n", ip);
    }
 
    curl_easy_cleanup(curl);
    curl_global_cleanup(); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值