title: Having trouble building a Dns Packet in Python
body: <p>I'm trying to build a dns packet to send over a socket. I don't want to use any libraries because I want direct access to the socket variable that sends it. Whenever I send the DNS packet, wireshark says that it's malformed. What exactly am I doing wrong?</p>
  
  <p>Some things that are wrong with the Dns packet itself:
      It says it has 256 questions, no class and no type</p>
  
  <pre><code>  class DnsPacketBuilder:
  
  def __init__(self):
      pass
  
  def build_packet(self, url):
      packet = struct.pack("H", 12049)  # Query Ids (Just 1 for now)
      packet += struct.pack("H", 256)  # Flags
      packet += struct.pack("H", 1)  # Questions
      packet += struct.pack("H", 0)  # Answers
      packet += struct.pack("H", 0)  # Authorities
      packet += struct.pack("H", 0)  # Additional
      split_url = url.split(".")
      for part in split_url:
          packet += struct.pack("B", len(part))
          for byte in bytes(part):
              packet += struct.pack("c", byte)
      packet += struct.pack("B", 0)  # End of String
      packet += struct.pack("H", 1)  # Query Type
      packet += struct.pack("H", 1)  # Query Class
      return packet
  
  # Sending the packet
  builder = DnsPacketBuilder()
  packet = builder.build_packet("www.northeastern.edu")
  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  sock.bind(('', 8888))
  sock.settimeout(2)
  sock.sendto(bytes(packet), ("208.67.222.222", 53))
  print("Packet Sent")
  data, addr = sock.recvfrom(1024)
  print("Response: " + data)
  sock.close()
  </code></pre>