C++实现DNS域名解析(二)
trCNameList = NULL, ULONG ulTimeout = 1000, ULONG *pulTimeSpent = NULL);
37 BOOL DNSLookup(ULONG ulDNSServerIP, char *szDomainName, std::vector *pvecstrIPList = NULL, std::vector *pvecstrCNameList = NULL, ULONG ulTimeout = 1000, ULONG *pulTimeSpent = NULL);
38
39 private:
40 BOOL Init();
41 BOOL UnInit();
42 BOOL DNSLookupCore(ULONG ulDNSServerIP, char *szDomainName, std::vector *pveculIPList, std::vector *pvecstrCNameList, ULONG ulTimeout, ULONG *pulTimeSpent);
43 BOOL SendDNSRequest(sockaddr_in sockAddrDNSServer, char *szDomainName);
44 BOOL RecvDNSResponse(sockaddr_in sockAddrDNSServer, ULONG ulTimeout, std::vector *pveculIPList, std::vector *pvecstrCNameList, ULONG *pulTimeSpent);
45 BOOL EncodeDotStr(char *szDotStr, char *szEncodedStr, USHORT nEncodedStrSize);
46 BOOL DecodeDotStr(char *szEncodedStr, USHORT *pusEncodedStrLen, char *szDotStr, USHORT nDotStrSize, char *szPacketStartPos = NULL);
47 ULONG GetTickCountCalibrate();
48
49 private:
50 BOOL m_bIsInitOK;
51 SOCKET m_sock;
52 WSAEVENT m_event;
53 USHORT m_usCurrentProcID;
54 char *m_szDNSPacket;
55 };
复制代码
复制代码
1 #include "DNSLookup.h"
2 #include
3 #include
4
5 CDNSLookup::CDNSLookup() :
6 m_bIsInitOK(FALSE),
7 m_sock(INVALID_SOCKET),
8 m_szDNSPacket(NULL)
9 {
10 m_bIsInitOK = Init();
11 }
12
13 CDNSLookup::~CDNSLookup()
14 {
15 UnInit();
16 }
17
18 BOOL CDNSLookup::DNSLookup(ULONG ulDNSServerIP, char *szDomainName, std::vector *pveculIPList, std::vector *pvecstrCNameList, ULONG ulTimeout, ULONG *pulTimeSpent)
19 {
21 }
22
23 BOOL CDNSLookup::DNSLookup(ULONG ulDNSServerIP, char *szDomainName, std::vector *pvecstrIPList, std::vector *pvecstrCNameList, ULONG ulTimeout, ULONG *pulTimeSpent)
24 {
25 std::vector *pveculIPList = NULL;
26 if (pvecstrIPList != NULL)
27 {
28 std::vector veculIPList;
29 pveculIPList = &veculIPList;
30 }
31
32 BOOL bRet = DNSLookupCore(ulDNSServerIP, szDomainName, pveculIPList, pvecstrCNameList, ulTimeout, pulTimeSpent);
33
34 if (bRet)
35 {
36 pvecstrIPList->clear();
37 char szIP[16] = {'\0'};
38 for (std::vector::iterator iter = pveculIPList->begin(); iter != pveculIPList->end(); ++iter)
39 {
40 BYTE *pbyIPSegment = (BYTE*)(&(*iter));
41 //sprintf_s(szIP, 16, "%d.%d.%d.%d", pbyIPSegment[0], pbyIPSegment[1], pbyIPSegment[2], pbyIPSegment[3]);
42 sprintf(szIP, "%d.%d.%d.%d", pbyIPSegment[0], pbyIPSegment[1], pbyIPSegment[2], pbyIPSegment[3]);
43 pvecstrIPList->push_back(szIP);
44 }
45 }
46
47 return bRet;
48 }
49
50
51 BOOL CDNSLookup::Init()
52 {
53 WSADATA wsaData;
54 if (WSAStartup(MAKEWORD(2, 2), &wsaData) == SOCKET_ERROR)
55 {
56 return FALSE;
57 }
58
59 if ((m_sock = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
60 {
61 return FALSE;
62 }
63
64 m_event = WSACreateEvent();
65 WSAEventSelect(m_sock, m_ev