Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.24 KB | None | 0 0
  1.       void DNSResolver::interactive(string input, vector<string> dns_servers)
  2.  
  3.       {
  4.  
  5.               char buffer[512];
  6.               SOCKET sock;
  7.  
  8.               sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  9.  
  10.               if (sock == INVALID_SOCKET)
  11.  
  12.               {
  13.  
  14.                       printf ("socket() generated error %d\n", WSAGetLastError());
  15.  
  16.                       WSACleanup ();
  17.  
  18.                       return;
  19.  
  20.               }
  21.  
  22.              
  23.  
  24.               struct sockaddr_in destination;
  25.  
  26.        
  27.  
  28.               destination.sin_family = AF_INET;
  29.  
  30.               destination.sin_port = htons(53);
  31.  
  32.               destination.sin_addr.s_addr = inet_addr(dns_servers[0].c_str());
  33.  
  34.               fixedDNSheader* dns = (fixedDNSheader*) &buffer;
  35.  
  36.               dns->ID = htons(sock);
  37.  
  38.               dns->flags = htons(DNS_QUERY | DNS_RD);
  39.  
  40.               dns->opcode = 0;
  41.  
  42.               dns->authoritiveAnswer = 0;
  43.  
  44.               dns->truncated = 0;
  45.  
  46.               dns->recursionDesired = 0;
  47.               dns->recursionAvailable = 0;
  48.               dns->zBit = 0;
  49.               dns->authenticatedData = 0;
  50.                 dns->checkingDisabled = 0;
  51.                 dns->responseCode = 0;
  52.               dns->numQuestions = htons(1); // One question
  53.               dns->numAnswer = 0;
  54.               dns->numAutorityAnswers = 0;
  55.               dns->numAdditional = 0;
  56.  
  57.               char* queryName = (char*)&buffer[sizeof(fixedDNSheader)];
  58.  
  59.              // queryHeader* QH = (queryHeader*) (buffer + 512 - sizeof(queryName));  
  60.                 queryHeader* QH = (queryHeader*)&buffer[sizeof(fixedDNSheader) + sizeof(queryName) + 1];
  61.  
  62.               if (newParser.validateIpAddress(input) == true)
  63.  
  64.               {
  65.                       string reverseIP = newParser.reverseStr(input);
  66.                       reverseIP.append(".in-addr.arpa");
  67.                       makeDNSquestion(queryName +1, reverseIP);
  68.                       QH->type = DNS_PTR;
  69.                       QH->queryClass = htons(1);
  70.               }
  71.               else
  72.               {
  73.                       makeDNSquestion(queryName + 1, input);
  74.                       QH->type = DNS_A;
  75.                       QH->queryClass = htons(1);
  76.               }
  77.  
  78.        
  79.  
  80.               struct sockaddr_in listen;
  81.  
  82.        
  83.    
  84.               listen.sin_family = AF_INET;
  85.  
  86.               listen.sin_addr.S_un.S_addr = INADDR_ANY;
  87.  
  88.               listen.sin_port = 0;
  89.  
  90.        
  91.  
  92.               if (bind(sock, (SOCKADDR*) &listen, sizeof(listen)) == SOCKET_ERROR)
  93.  
  94.               {
  95.  
  96.                       printf("bind() failed.\n");
  97.  
  98.                       closesocket(sock);
  99.  
  100.                       return;
  101.  
  102.               }
  103.  
  104.  
  105.               int count = 0;
  106.  
  107.               while (count++ < 3)
  108.  
  109.               {
  110.  
  111.                       printf("Sending Packet...\n");
  112.  
  113.                       if (sendto(sock, (char*)buffer, sizeof(fixedDNSheader) + (strlen((const char*) queryName) + 1) +
  114.  
  115.                               sizeof(QH), 0, (struct sockaddr*)&destination, sizeof(destination)) == SOCKET_ERROR)
  116.  
  117.                       {
  118.  
  119.                               printf("%d error", WSAGetLastError());
  120.  
  121.                       }
  122.  
  123.                       printf("Sent\n");
  124.  
  125.        
  126.  
  127.                       timeval timeout;
  128.    
  129.                       timeout.tv_sec = 15;
  130.  
  131.                       timeout.tv_usec = 0;
  132.  
  133.        
  134.  
  135.                       fd_set fd;
  136.  
  137.                       FD_ZERO (&fd);
  138.  
  139.                       FD_SET (sock, &fd);
  140.  
  141.                       int available = select(0, &fd, NULL, NULL, &timeout);
  142.                       if (available > 0)
  143.  
  144.                       {
  145.                               int i = sizeof(destination);
  146.                               printf("Receiving answer...\n");
  147.                               if(recvfrom (sock, (char*)buffer, 512, 0, (struct sockaddr*)&destination, &i) == SOCKET_ERROR)
  148.                               {
  149.                                       printf("Failed. Error Code : %d",WSAGetLastError());
  150.                               }
  151.                               printf("Received.");
  152.                               break;
  153.  
  154.                  }
  155.  
  156.               }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement