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++ 2.69 KB | None | 0 0
  1. void DNSResolver::interactive(string input, vector<string> dns_servers)
  2. {
  3.     int pkt_size = input.size() + 2 + sizeof(fixedDNSheader) + sizeof(queryHeader);
  4.     char *buffer = new char [pkt_size];
  5.  
  6.     SOCKET sock;
  7.  
  8.     sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  9.     if (sock == INVALID_SOCKET)
  10.     {
  11.         printf ("socket() generated error %d\n", WSAGetLastError());
  12.         WSACleanup (); 
  13.         return;
  14.     }
  15.    
  16.     struct sockaddr_in destination;
  17.  
  18.     destination.sin_family = AF_INET;
  19.     destination.sin_port = htons(53);
  20.     destination.sin_addr.s_addr = inet_addr(dns_servers[0].c_str());
  21.  
  22.     fixedDNSheader* dns = (fixedDNSheader*) buffer;
  23.  
  24.     dns->ID = htons(sock);
  25.     dns->flags = htons(DNS_QUERY | DNS_RD);
  26.     dns->opcode = 0;
  27.     dns->authoritiveAnswer = 0;
  28.     dns->truncated = 0;
  29.     dns->recursionDesired = 0;
  30.     dns->recursionAvailable = 0;
  31.     dns->zBit = 0;
  32.     dns->authenticatedData = 0;
  33.     dns->checkingDisabled = 0;
  34.     dns->responseCode = 0;
  35.     dns->numQuestions = htons(1); // One question
  36.     dns->numAnswer = 0;
  37.     dns->numAutorityAnswers = 0;
  38.     dns->numAdditional = 0;
  39.  
  40.     char* queryName = (char*)&buffer[sizeof(fixedDNSheader)];
  41.     queryHeader* QH = (queryHeader*) (buffer + pkt_size - sizeof(queryHeader));
  42.  
  43.     if (newParser.validateIpAddress(input) == true)
  44.     {
  45.         string reverseIP = newParser.reverseStr(input);
  46.  
  47.         reverseIP.append(".in-addr.arpa");
  48.  
  49.         makeDNSquestion(queryName, reverseIP);
  50.         QH->type = DNS_PTR;
  51.         QH->queryClass = htons(1);
  52.     }
  53.     else
  54.     {
  55.         makeDNSquestion((char *) (dns + 1), input);
  56.         QH->type = DNS_A;
  57.         QH->queryClass = htons(1);
  58.     }
  59.  
  60.     struct sockaddr_in listen;
  61.  
  62.     listen.sin_family = AF_INET;
  63.     listen.sin_addr.S_un.S_addr = INADDR_ANY;
  64.     listen.sin_port = htons(0);
  65.  
  66.     if (bind(sock, (SOCKADDR*) &listen, sizeof(listen)) == SOCKET_ERROR)
  67.     {
  68.         printf("bind() failed.\n");
  69.         printf("%d error\n", WSAGetLastError());
  70.         closesocket(sock);
  71.         return;
  72.     }
  73.  
  74.     int count = 0;
  75.     while (count++ < 3)
  76.     {
  77.         printf("Sending Packet...\n");
  78.         if (sendto(sock, (char*)buffer, sizeof(fixedDNSheader) + (strlen((const char*) queryName) + 1) +
  79.             sizeof(QH), 0, (struct sockaddr*)&destination, sizeof(destination)) == SOCKET_ERROR)
  80.         {
  81.             printf("%d error", WSAGetLastError());
  82.         }
  83.         printf("Sent\n");
  84.  
  85.         timeval timeout;
  86.         timeout.tv_sec = 30;
  87.         timeout.tv_usec = 0;
  88.  
  89.         fd_set fd;
  90.         FD_ZERO (&fd);
  91.         FD_SET (sock, &fd);
  92.  
  93.         int available = select(0, &fd, NULL, NULL, &timeout);
  94.  
  95.         if (available > 0)
  96.         {
  97.             int i = sizeof(destination);
  98.  
  99.             printf("Receiving answer...\n");
  100.  
  101.             if(recvfrom (sock, (char*)buffer, 512, 0, (struct sockaddr*)&destination, &i) == SOCKET_ERROR)
  102.             {
  103.                 printf("Failed. Error Code : %d",WSAGetLastError());
  104.             }
  105.  
  106.             printf("Received.");
  107.  
  108.             break;
  109.         }
  110.     }
  111.     delete buffer;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement