22
33bool RFCTask_DNS_Parse (LPCXSTR lpszClientAddr, LPCXSTR lpszMSGBuffer, int nMSGLen)
44{
5+ bool bQuery = false ;
56 int nSDLen = 0 ;
67 int nRequestID = 0 ;
78 XCHAR tszSDBuffer[4096 ] = {};
@@ -10,6 +11,7 @@ bool RFCTask_DNS_Parse(LPCXSTR lpszClientAddr, LPCXSTR lpszMSGBuffer, int nMSGLe
1011 if (!DNSProtocol_Parse_Header (lpszMSGBuffer, nMSGLen, &nRequestID, &st_DNSRequest))
1112 {
1213 DNSProtocol_Packet_Error (tszSDBuffer, &nSDLen, nRequestID, &st_DNSRequest, XENGINE_DNSPROTOCOL_QUERY_QUESTION_STATUS_FORMAT);
14+ NetCore_UDPXCore_SendEx (xhDNSSocket, lpszClientAddr, tszSDBuffer, nSDLen);
1315 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" DNS客户端:%s,发送的DNS协议不正确" ), lpszClientAddr);
1416 return false ;
1517 }
@@ -33,6 +35,7 @@ bool RFCTask_DNS_Parse(LPCXSTR lpszClientAddr, LPCXSTR lpszMSGBuffer, int nMSGLe
3335 }
3436 DNSProtocol_Packet_REPHeader (tszSDBuffer, &nSDLen, nRequestID, &st_DNSRequest, &ppSt_DNSAnswer, nListCount);
3537 BaseLib_Memory_Free ((XPPPMEM)&ppSt_DNSAnswer, nListCount);
38+ bQuery = true ;
3639 }
3740 }
3841 else if (XENGINE_DNSPROTOCOL_QUERY_QUESTION_TYPE_PTR == st_DNSRequest.st_QueryInfo .nNameType )
@@ -41,25 +44,50 @@ bool RFCTask_DNS_Parse(LPCXSTR lpszClientAddr, LPCXSTR lpszMSGBuffer, int nMSGLe
4144 int nListCount = 1 ;
4245 XCHAR tszIPStr[256 ] = {};
4346 XENGINE_DNSADDRINFO st_DNSAddr = {};
44- XENGINE_DNSPROTOCOL** ppSt_DNSAnswer;
45-
47+
4648 DNSProtocol_Help_PTRStr (st_DNSRequest.tszNameStr , tszIPStr, &nIPVer);
47- BaseLib_Memory_Malloc ((XPPPMEM)&ppSt_DNSAnswer, nListCount, sizeof (XENGINE_DNSPROTOCOL));
48-
4949 if (ModuleHelp_DNSAddr_FindPtr (tszIPStr, &st_DNSAddr))
5050 {
51+ XENGINE_DNSPROTOCOL** ppSt_DNSAnswer;
52+ BaseLib_Memory_Malloc ((XPPPMEM)&ppSt_DNSAnswer, nListCount, sizeof (XENGINE_DNSPROTOCOL));
53+
5154 ppSt_DNSAnswer[0 ]->nTTL = st_DNSAddr.nTTL ;
5255 ppSt_DNSAnswer[0 ]->st_QueryInfo .nNameType = XENGINE_DNSPROTOCOL_QUERY_QUESTION_TYPE_PTR;
5356 ppSt_DNSAnswer[0 ]->st_QueryInfo .nNameClass = XENGINE_DNSPROTOCOL_QUERY_QUESTION_CLASS_IN;
5457 _tcsxcpy (ppSt_DNSAnswer[0 ]->tszNameStr , st_DNSAddr.tszDNSAddr );
5558 _tcsxcpy (ppSt_DNSAnswer[0 ]->tszAddrStr , st_DNSAddr.tszDNSName );
59+
60+ DNSProtocol_Packet_REPHeader (tszSDBuffer, &nSDLen, nRequestID, &st_DNSRequest, &ppSt_DNSAnswer, nListCount);
61+ BaseLib_Memory_Free ((XPPPMEM)&ppSt_DNSAnswer, nListCount);
62+ bQuery = true ;
5663 }
57- DNSProtocol_Packet_REPHeader (tszSDBuffer, &nSDLen, nRequestID, &st_DNSRequest, &ppSt_DNSAnswer, nListCount);
58- BaseLib_Memory_Free ((XPPPMEM)&ppSt_DNSAnswer, nListCount);
64+ }
65+
66+ if (!bQuery)
67+ {
68+ // 选择一个备用DNS服务器
69+ XCHAR tszIPServer[128 ] = {};
70+ ModuleHelp_DNSAddr_Select (tszIPServer);
71+ // 创建UDP查询连接
72+ XSOCKET hSocket = XSOCKET_ERROR;
73+ XClient_UDPSelect_Create (&hSocket);
74+ XClient_UDPSelect_Bind (hSocket, 12331 );
75+ XClient_UDPSelect_Connect (hSocket, tszIPServer, 53 );
76+ XClient_UDPSelect_SendMsg (hSocket, lpszMSGBuffer, nMSGLen);
77+
78+ if (!BaseLib_IO_Select (hSocket, true , 2000 ))
79+ {
80+ DNSProtocol_Packet_Error (tszSDBuffer, &nSDLen, nRequestID, &st_DNSRequest, XENGINE_DNSPROTOCOL_QUERY_QUESTION_STATUS_SERVFAIL);
81+ NetCore_UDPXCore_SendEx (xhDNSSocket, lpszClientAddr, tszSDBuffer, nSDLen);
82+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X (" DNS客户端:%s,请求备用服务器数据失败,数据超时" ), lpszClientAddr);
83+ return false ;
84+ }
85+ nSDLen = 4096 ;
86+ XClient_UDPSelect_RecvMsg (hSocket, tszSDBuffer, &nSDLen);
87+ XClient_UDPSelect_Close (hSocket);
5988 }
6089
6190 NetCore_UDPXCore_SendEx (xhDNSSocket, lpszClientAddr, tszSDBuffer, nSDLen);
6291 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X (" DNS客户端:%s,发送DNS协议给服务器,处理成功" ), lpszClientAddr);
63-
6492 return true ;
6593}
0 commit comments