返回> 网站首页 

获取域名TXT解析数据

yoours2026-02-27 09:41:15 阅读 22

简介一边听听音乐,一边写写文章。

一、介绍

    在申请域名数字证书时,通常需要配置域名的TXT记录,可以考虑使用此种方式进行辅助通讯认证。


二、使用windows命令获取TXT记录

    例如:

        nslookup -q=TXT _acme-challenge.soskp.com


三、使用C++获取TXT记录

#include <windows.h>

#include <windns.h>

#include <vector>

#include <string>

#include <iostream>


#pragma comment(lib, "Ws2_32.lib")

#pragma comment(lib, "dnsapi.lib")


// 将宽字符串转换为 UTF-8 多字节字符串(

std::string WStringToString(const std::wstring& wstr)

{

    if (wstr.empty()) return std::string();

    int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);

    std::string strTo(size_needed, 0);

    WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);

    return strTo;

}


// 查询指定域名的所有 TXT 记录

bool QueryTxtRecords(const std::wstring& domainName)

{

    PDNS_RECORD pDnsRecord = NULL;

    DNS_STATUS status = DnsQuery(

        domainName.c_str(),             // 查询的域名(宽字符串)

        DNS_TYPE_TEXT,                   // 查询类型:TXT

        DNS_QUERY_STANDARD,               // 标准查询

        NULL,                             // 不使用指定 DNS 服务器(使用系统默认)

        &pDnsRecord,                       // 返回的记录列表

        NULL                               // 保留

    );


    if (status != ERROR_SUCCESS)

    {

        std::cerr << "DNS 查询失败,错误码: " << status << std::endl;

        return false;

    }


    std::cout << "查询域名: " << WStringToString(domainName) << " 的 TXT 记录:" << std::endl;


    bool found = false;

    PDNS_RECORD pCurrent = pDnsRecord;

    int recordIndex = 1;


    while (pCurrent)

    {

        // 只处理 TXT 类型记录

        if (pCurrent->wType == DNS_TYPE_TEXT)

        {

            found = true;

            // 获取 TXT 记录中的数据

            // TXT 记录可能包含多个字符串片段(pStringArray),需要拼接

            std::wstring txtValue;

            for (DWORD i = 0; i < pCurrent->Data.TXT.dwStringCount; i++)

            {

                if (pCurrent->Data.TXT.pStringArray[i])

                {

                    // pStringArray[i] 是 const char* 类型(ANSI)

                    txtValue += pCurrent->Data.TXT.pStringArray[i];

                }

            }


            // 获取 TTL

            DWORD ttl = pCurrent->dwTtl;

            std::cout << "记录 " << recordIndex++ << ":" << std::endl;

            std::cout << "  TTL: " << ttl << " 秒" << std::endl;

            std::wcout << "  值: " << txtValue << std::endl;

        }

        pCurrent = pCurrent->pNext;

    }


    if (!found)

        std::cout << "未找到任何 TXT 记录。" << std::endl;

    // 释放 DNS 记录内存

    DnsRecordListFree(pDnsRecord, DnsFreeRecordList);

    return true;

}


int main()

{

    // 初始化 Winsock(虽然 DnsQuery 不严格要求,但某些网络功能可能需要)

    WSADATA wsaData;

    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);

    if (result != 0)

    {

        std::cerr << "WSAStartup 失败: " << result << std::endl;

        return 1;

    }


    // 要查询的域名

    std::wstring domain = L"_acme-challenge.soskp.com";  // 使用宽字符串,DnsQuery 需要

    // 执行查询

    QueryTxtRecords(domain);

    // 清理 Winsock

    WSACleanup();

    std::cout << "\n按回车键退出...";

    std::cin.get();

    return 0;

}



微信小程序扫码登陆

文章评论

22人参与,0条评论