Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在windows上使用Win32 API修改dns缓存(无主机文件)_C++_Dns - Fatal编程技术网

C++ 在windows上使用Win32 API修改dns缓存(无主机文件)

C++ 在windows上使用Win32 API修改dns缓存(无主机文件),c++,dns,C++,Dns,我需要修改dns缓存,例如,将www.microsoft.com重定向到111.222.333.444。而不是通过修改etc/hosts文件 我看到ipconfig/displaydns正在输出dns缓存,它由一个名为“dns客户端”的服务维护,我可以修改缓存吗 谷歌说有一个APIDnsModifyRecordsInSet可以完成这项工作,还有一个来自sdk的示例:MicrosoftSDK\uuxamples\netds\DNS\ModifyRecords,我尝试了这个示例,但它抱怨不同网站的错

我需要修改dns缓存,例如,将www.microsoft.com重定向到111.222.333.444。而不是通过修改etc/hosts文件

我看到ipconfig/displaydns正在输出dns缓存,它由一个名为“dns客户端”的服务维护,我可以修改缓存吗

谷歌说有一个APIDnsModifyRecordsInSet可以完成这项工作,还有一个来自sdk的示例:
MicrosoftSDK\uuxamples\netds\DNS\ModifyRecords
,我尝试了这个示例,但它抱怨不同网站的错误代码为9005/9004/9002/9009,下面是命令行:

test.exe -n www.microsoft.com -t A -l 360 -d 127.0.0.1
Failed to add the host record for www.microsoft.com and the error is 9004

test.exe -n www.bing.com -t A -l 360 -d 127.0.0.1
Failed to add the host record for www.bing.com and the error is 9009

test.exe -n www.test.com -t A -l 360 -d 127.0.0.1
Failed to add the host record for www.test.com and the error is 9002
....
代码如下:

#include <windows.h>  //windows
#include <windns.h>   //DNS api's
#include <stdio.h>    //standard i/o
#include <winsock.h>  //winsock

#define BUFFER_LEN 255

//Usage of the program
void Usage(char *progname) {
    fprintf(stderr,"Usage\n%s -n [OwnerName] - t [Type] -l [Ttl] -d [Data] -s [DnsServerIp]\n",
            progname);
    fprintf(stderr,"Where:\n\tOwnerName is the owner field to be added\n");
    fprintf(stderr,"\tType is the type of resource record to be added A or CNAME\n");
    fprintf(stderr,"\tData is the data corresponding to RR to be added\n"); 
    fprintf(stderr,"\tTtl is the time to live value in seconds \n");
    fprintf(stderr,"\tDnsServerIp is the ipaddress of DNS server (in dotted decimal notation)\n");
    exit(1);
}

//  the main function 
void __cdecl main(int argc, char *argv[])

{

    DNS_STATUS status;               // return value of  DnsModifyRecordsInSet() function.
    PDNS_RECORD pmyDnsRecord = NULL; //pointer to DNS_RECORD structure
    PIP4_ARRAY pSrvList = NULL;      //pinter to IP4_ARRAY structure
    LPTSTR pOwnerName = NULL, pNameData = NULL;  //owner name and the data for CNAME resource record
    char HostipAddress[BUFFER_LEN];         //Ip address required to add host record
    char DnsServIp[BUFFER_LEN];             //DNS server ip address

    memset(HostipAddress, 0, sizeof(HostipAddress) );
    memset(DnsServIp, 0, sizeof(DnsServIp) );


    //Allocate memory for DNS_RECORD structure.

    pmyDnsRecord = (PDNS_RECORD) LocalAlloc( LPTR, sizeof( DNS_RECORD ) );

    if (!pmyDnsRecord) {
        printf("Memory allocaltion failed\n");
        exit(1);
    }

    if (argc > 8) {

        for (int i = 1; i < argc ; i++) {

            if ( (argv[i][0] == '-') || (argv[i][0] == '/') ) {

                switch (tolower(argv[i][1])) {

                case 'n':
                    pOwnerName = argv[++i];
                    pmyDnsRecord->pName = pOwnerName; //copy the Owner name information 
                    break;

                case 't':
                    if (!_stricmp(argv[i+1], "A") )
                        pmyDnsRecord->wType = DNS_TYPE_A; //add host records
                    else if (!_stricmp(argv[i+1], "CNAME") )
                        pmyDnsRecord->wType = DNS_TYPE_CNAME; //add CNAME records
                    else
                        Usage(argv[0]);
                    i++;
                    break;

                case 'l':
                    pmyDnsRecord->dwTtl = atoi(argv[++i]); // time to live value in seconds
                    break;
                case 'd':
                    if (pmyDnsRecord->wType == DNS_TYPE_A) {
                        pmyDnsRecord->wDataLength = sizeof(DNS_A_DATA); //data structure for A records
                        strncpy(HostipAddress, argv[++i], sizeof(HostipAddress)-1);
                        HostipAddress[sizeof(HostipAddress)-1] = '\0';
                        pmyDnsRecord->Data.A.IpAddress = inet_addr(HostipAddress); //convert string to proper address
                        if ( pmyDnsRecord->Data.A.IpAddress == INADDR_NONE ) {
                            printf("Invalid IP address in A record data \n");
                            Usage(argv[0]);
                        }
                        break;
                    }
                    else {
                        pmyDnsRecord->wDataLength = sizeof(DNS_PTR_DATA); //data structure for CNAME records
                        pNameData = argv[++i];
                        pmyDnsRecord->Data.Cname.pNameHost = pNameData;
                        break;
                    }
                case 's':
                    // Allocate memory for IP4_ARRAY structure
                    pSrvList = (PIP4_ARRAY) LocalAlloc(LPTR,sizeof(IP4_ARRAY));
                    if (!pSrvList) {
                        printf("Memory allocation failed \n");
                        exit(1);
                    }
                    if (argv[++i]) {
                        strncpy(DnsServIp,argv[i],sizeof(DnsServIp)-1);
                        DnsServIp[sizeof(DnsServIp)-1] = '\0';
                        pSrvList->AddrCount = 1;
                        pSrvList->AddrArray[0] = inet_addr(DnsServIp); //DNS server IP address
                        if ( pSrvList->AddrArray[0] == INADDR_NONE ) {
                            printf("Invalid DNS server IP address\n");
                            Usage(argv[0]);
                        }
                        break; 
                    }
                default:
                    Usage(argv[0]);
                    break;
                }
            }
            else
                Usage(argv[0]);
        }   
    } else {
        Usage(argv[0]);
    }
    // Calling function DNSModifyRecordsInSet_A to add Host or CNAME records    

    status = DnsModifyRecordsInSet_A(pmyDnsRecord,                     //pointer to DNS_RECORD
                                     NULL,                      
                                     DNS_UPDATE_SECURITY_USE_DEFAULT,  //do not attempt secure dynamic updates
                                     NULL,                             //use default credentials
                                     pSrvList,                         //contains DNS server IP address
                                     NULL);                            //reserved for future use

    if (status) {
        if (pmyDnsRecord->wType == DNS_TYPE_A)
            printf("Failed to add the host record for %s and the error is %d \n", pOwnerName, status);
        else
            printf("Failed to add the Cname record for %s and the error is %d \n", pOwnerName, status);
    }
    else {
        if (pmyDnsRecord->wType == DNS_TYPE_A)
            printf("Successfully added the host record for %s \n", pOwnerName);
        else
            printf("Successfully added the Cname record for %s \n", pOwnerName);
    }           

    LocalFree(pmyDnsRecord); // Free the memory allocated for DNS_RECORD structure
    LocalFree(pSrvList);     // Free the memory allocated for IP4_ARRAY structure
}
#包括//窗口
#包括//DNS api
#包括//标准i/o
#包括//winsock
#定义缓冲区长度255
//程序的使用
无效用法(char*progname){
fprintf(stderr,“用法\n%s-n[OwnerName]-t[Type]-l[Ttl]-d[Data]-s[DnsServerIp]\n”,
项目名称);
fprintf(stderr,“其中:\n\tOwnerName是要添加的所有者字段\n”);
fprintf(stderr,“\t类型是要添加的资源记录的类型或CNAME\n”);
fprintf(stderr,“\t数据是与要添加的RR相对应的数据\n”);
fprintf(stderr,“\tTtl是生存时间值,以秒为单位\n”);
fprintf(stderr,“\tDnsServerIp是DNS服务器的IP地址(以点十进制表示)\n”);
出口(1);
}
//主要功能
void uu cdecl main(int argc,char*argv[])
{
DNS_STATUS STATUS;//DnsModifyRecordsInSet()函数的返回值。
PDNS_RECORD pmyDnsRecord=NULL;//指向DNS_记录结构的指针
PIP4_数组pSrvList=NULL;//pinter到IP4_数组结构
LPTSTR pOwnerName=NULL,pNameData=NULL;//所有者名称和CNAME资源记录的数据
char HostipAddress[BUFFER_LEN];//添加主机记录所需的Ip地址
char DnsServIp[BUFFER_LEN];//DNS服务器ip地址
memset(HostipAddress,0,sizeof(HostipAddress));
memset(DnsServIp,0,sizeof(DnsServIp));
//为DNS_记录结构分配内存。
pmyDnsRecord=(PDNS_记录)LocalAlloc(LPTR,sizeof(DNS_记录));
如果(!pmyDnsRecord){
printf(“内存分配失败\n”);
出口(1);
}
如果(argc>8){
对于(int i=1;ipName=pOwnerName;//复制所有者名称信息
打破
案例“t”:
if(!\u stricmp(argv[i+1],“A”))
pmyDnsRecord->wType=DNS\u TYPE\u A;//添加主机记录
else if(!\u stricmp(argv[i+1],“CNAME”))
pmyDnsRecord->wType=DNS\u TYPE\u CNAME;//添加CNAME记录
其他的
用法(argv[0]);
i++;
打破
案例“l”:
pmyDnsRecord->dwTtl=atoi(argv[++i]);//生存时间值(秒)
打破
案例“d”:
如果(pmyDnsRecord->wType==DNS\u TYPE\u A){
pmyDnsRecord->wDataLength=sizeof(DNS_A_数据);//记录的数据结构
strncpy(HostipAddress,argv[++i],sizeof(HostipAddress)-1;
HostipAddress[sizeof(HostipAddress)-1]='\0';
pmyDnsRecord->Data.A.IpAddress=inet_addr(HostipAddress);//将字符串转换为正确的地址
如果(pmyDnsRecord->Data.A.IpAddress==INADDR\u NONE){
printf(“记录数据中的IP地址无效”);
用法(argv[0]);
}
打破
}
否则{
pmyDnsRecord->wDataLength=sizeof(DNS_PTR_DATA);//CNAME记录的数据结构
pNameData=argv[++i];
pmyDnsRecord->Data.Cname.pNameHost=pNameData;
打破
}
案例s:
//为IP4_阵列结构分配内存
pSrvList=(PIP4_数组)LocalAlloc(LPTR,sizeof(IP4_数组));
如果(!pSrvList){
printf(“内存分配失败\n”);
出口(1);
}
if(argv[++i]){
strncpy(DnsServIp,argv[i],sizeof(DnsServIp)-1;
DnsServIp[sizeof(DnsServIp)-1]='\0';
pSrvList->AddrCount=1;
pSrvList->AddrArray[0]=inet_addr(DnsServIp);//DNS服务器IP地址
if(pSrvList->AddrArray[0]==INADDR\u NONE){
printf(“无效的DNS服务器IP地址\n”);
用法(argv[0]);
}
打破
}
违约:
用法(argv[0]);
打破
}
}
其他的
用法(argv[0]);
}   
}否则{
用法(argv[0]);
}
//调用函数DNSModifyRecordsInSet_A以添加主机或CNAME记录
status=DnsModifyRecordsInSet_A(pmyDnsRecord,//指向DNS_记录的指针
无效的
DNS\u更新\u安全性\u使用\u默认值,//不要尝试安全的动态更新
NULL,//使用默认凭据
pSrvList,//包含DNS服务器IP地址
NULL);//保留供将来使用