Answer the following questions to describe your code submission. Please keep all lines to a maximum of 80 characters wide. 1 - Your implementation must send an array of bytes to the server. Explain the meaning of these bytes and how the server interprets them. The bytes we send form a complete DNS request, which is hardcoded. The first 12 bytes make up the DNS header, which includes a transaction ID, flags, and counts of questions, answers, authority, and additional records. After the header, we include the question section, which specifies the domain name (which is a 0 length label which mean root server), the record type (A = IPv4), and the class (IN = Internet). The server interprets these bytes as a query asking for the IPv4 address of the root domain, and responds with the A record containing the IP address of one of the root servers a.root-servers.net. or b.root-servers.net. 2 - Show (in pseudocode) how you set up your socket to send your message, including a description of how you specified the address and port number. What would you have to change to send an HTTP message (which uses TCP) to a server? const char *hostname = "127.0.0.1"; const char *port = get_port (); struct addrinfo *server_list = get_server_list (hostname, port, false, false); int sockfd = socket (server_list->ai_family, server_list->ai_socktype, 0); We do this to specify the hostname and port. To send an HTTP message to a server we would hardcode the port to be 80 and create the socket using SOCK_STREAM. We would have to call connect() to establish the TCP handshake and then use send() to send the query and recv() to get the response.