DNSClient.cpp
上传用户:feituo2008
上传日期:2013-02-02
资源大小:493k
文件大小:5k
源码类别:

Email客户端

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "iphlpapi.h"
  3. #include "DNSClient.h"
  4. #include "udp.h"
  5. #include "util.h"
  6. CDNSClient::CDNSClient(void)
  7. : m_mx_server_count(0)
  8. , m_mx_servers(NULL)
  9. , m_dns_count(0)
  10. , m_dns_servers(NULL)
  11. {
  12. GetDNS();
  13. }
  14. CDNSClient::~CDNSClient(void)
  15. {
  16. FreeMxServers();
  17. FreeDnsServers();
  18. }
  19. int CDNSClient::GetMxServers(char * domain_name)
  20. {
  21. // 使用UDP查询结果
  22. int sd =udp_connect(m_dns_ip, 53);
  23. if(sd <0)
  24. return -1;
  25. FreeMxServers();
  26. char buf[512];
  27. memset(buf, 0, sizeof(buf));
  28. buf[0] =0;
  29. buf[1] =1;  // 序号
  30. buf[2] =1;  // 查询
  31. buf[3] =buf[4] =0;
  32. buf[5] =1;  // 1个问题
  33. char dm[100];
  34. strcpy(dm, domain_name);
  35. char *p =dm;
  36. char *p1 =strchr(p, '.');
  37. int pos =12;
  38. while(p)
  39. {
  40. if(p1) *p1 =0;
  41. buf[pos] =(char)strlen(p);
  42. strcpy(&buf[pos+1], p);
  43. pos +=(char)(strlen(p)+1);
  44. if(p1)
  45. {
  46. p =p1+1;
  47. p1 =strchr(p, '.');
  48. }
  49. else p =NULL;
  50. }
  51. buf[pos++] =0;
  52. buf[pos++] =0;
  53. buf[pos++] =15;
  54. buf[pos++] =0;
  55. buf[pos++] =1;
  56. udp_send(sd, buf, sizeof(buf));
  57. int len =udp_recv(sd, buf, sizeof(buf), 20);
  58. udp_close(sd);
  59. if(len <0)
  60. return -1;
  61. int qcount =(buf[4] & 0x00FF << 8) | (buf[5] & 0x00FF);  // 问题数
  62. if(qcount <0)
  63. return 0;
  64. int acount =(buf[6] & 0xFF << 8) | (buf[7] & 0x00FF);
  65. if(acount <0)
  66. return 0;
  67. pos =12;
  68. int i;
  69. //WriteBinData(buf, len);
  70. for(i =0; i<qcount; i++)
  71. {
  72. dm[0] =0;
  73. pos =SkipString(buf, pos, dm)+4;
  74. //WriteLog("dm:%s", dm);
  75. }
  76. for(i =0; i<acount; i++)
  77. {
  78. dm[0] =0;
  79. pos =SkipString(buf, pos, dm)+10+2;
  80. //WriteLog("dm:%s", dm);
  81. dm[0] =0;
  82. pos =SkipString(buf, pos, dm);
  83. //WriteLog("dm:%s", dm);
  84. AddMxServer(dm);
  85. WriteStat("mx server %d:%s", i, dm);
  86. }
  87. return m_mx_server_count;
  88. }
  89. int CDNSClient::GetDNS(void)
  90. {
  91. //strcpy(m_dns_ip, "202.103.96.112");
  92. IP_ADDR_STRING *pIPAddr;
  93. ULONG len;
  94. DWORD ret;
  95. FIXED_INFO *pfixed_info =(FIXED_INFO *)malloc(sizeof(FIXED_INFO));
  96. len =sizeof(FIXED_INFO);
  97. FreeDnsServers();
  98. if((ret =GetNetworkParams(pfixed_info, &len)) !=ERROR_BUFFER_OVERFLOW && ret !=0)
  99. {
  100. WriteLog("CDNSClient::GetDNS GetNetworkParams failed!");
  101. free(pfixed_info);
  102. return -1;
  103. }
  104. if(ret ==ERROR_BUFFER_OVERFLOW)
  105. {
  106. pfixed_info =(FIXED_INFO *)realloc(pfixed_info, len);
  107. if((ret =GetNetworkParams(pfixed_info, &len)) <0)
  108. {
  109. WriteLog("CDNSClient::GetDNS GetNetworkParams failed!");
  110. free(pfixed_info);
  111. return -1;
  112. }
  113. }
  114. pIPAddr =&pfixed_info->DnsServerList;
  115. while(pIPAddr)
  116. {
  117. AddDnsServer(pIPAddr->IpAddress.String);
  118. pIPAddr =pIPAddr->Next;
  119. }
  120. if(pfixed_info->CurrentDnsServer)
  121. strcpy(m_dns_ip, pfixed_info->CurrentDnsServer->IpAddress.String);
  122. else strcpy(m_dns_ip, m_dns_servers[0]);
  123. free(pfixed_info);
  124. return 0;
  125. }
  126. int CDNSClient::FreeMxServers(void)
  127. {
  128. if(m_mx_servers ==NULL || m_mx_server_count <=0) return 0;
  129. for(int i =0; i<m_mx_server_count; i++)
  130. free(m_mx_servers[i]);
  131. free(m_mx_servers);
  132. m_mx_servers =NULL;
  133. m_mx_server_count =0;
  134. return 0;
  135. }
  136. // add a mx server to m_mx_servers
  137. int CDNSClient::AddMxServer(char * server_name)
  138. {
  139. if(m_mx_servers ==NULL)
  140. m_mx_servers =(char **)malloc(sizeof(char *));
  141. else m_mx_servers =(char **)realloc(m_mx_servers, sizeof(char *)*(m_mx_server_count+1));
  142. if(m_mx_servers ==NULL) return -1;
  143. m_mx_servers[m_mx_server_count] =(char *)malloc(64);  // 域名最长64
  144. strcpy(m_mx_servers[m_mx_server_count], server_name);
  145. m_mx_server_count ++;
  146. return 0;
  147. }
  148. int CDNSClient::SkipString(char *buf, int pos, char *domain_name)
  149. {
  150. byte len;
  151. len =(char)buf[pos] & 0xFF;
  152. while(len !=0)
  153. {
  154. if(pos >512) return -1;
  155. pos ++;
  156. if((len & 0xc0) ==0xc0)  // 压缩格式
  157. {
  158. int offset =((len & 0x3f) << 8) | (buf[pos++] & 0xff);
  159. SkipString(buf, offset, domain_name);
  160. return pos;
  161. }
  162. else
  163. {
  164. int len2 =(int)strlen(domain_name);
  165. strncat(domain_name, &buf[pos], len);
  166. domain_name[len2+len] =0;
  167. pos +=len;
  168. }
  169. if(buf[pos]) strcat(domain_name, ".");
  170. len =buf[pos];
  171. }
  172. return pos+1;
  173. }
  174. int CDNSClient::FreeDnsServers(void)
  175. {
  176. if(m_dns_servers ==NULL || m_dns_count <=0) return 0;
  177. for(int i =0; i<m_dns_count; i++)
  178. free(m_dns_servers[i]);
  179. free(m_dns_servers);
  180. m_dns_servers =NULL;
  181. m_dns_count =0;
  182. return 0;
  183. }
  184. int CDNSClient::AddDnsServer(char *dns_server)
  185. {
  186. if(m_dns_servers ==NULL)
  187. m_dns_servers =(char **)malloc(sizeof(char *));
  188. else m_dns_servers =(char **)realloc(m_dns_servers, sizeof(char *)*(m_dns_count+1));
  189. if(m_dns_servers ==NULL) return -1;
  190. m_dns_servers[m_dns_count] =(char *)malloc(20);  // 域名最长64
  191. strcpy(m_dns_servers[m_dns_count], dns_server);
  192. m_dns_count ++;
  193. return 0;
  194. }