#include #include #include #include #include #include #include #include #include "dnshdr.h" int main() { int sockfd; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("Couldn't open socket. Is port available ?"); } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(5353); if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("Couldn't bind socket to ip/port."); close(sockfd); return 1; } unsigned char* buffer = calloc(512, sizeof(char*)); struct sockaddr_in client_addr; socklen_t client_len = sizeof(client_addr); while (1) { int buflen; buflen = recvfrom(sockfd, buffer, 512, 0, (struct sockaddr*)&client_addr, &client_len); if (buflen < 0) { perror("Unable to receive data"); continue; } printf("===== New request! %d bytes. =====\n", buflen); printf("Hexdump: \n"); for(int i = 0; iflags); printf("Id : %d\n", ntohs(hdr->id)); printf("Flags : QR=%d OPCODE=%d AA=%d TC=%d RD=%d RA=%d Z=%d AD=%d CD=%d RCODE=%d\n", (flags & 0x8000) >> 15, (flags & 0x7800) >> 11, (flags & 0x0400) >> 10, (flags & 0x0200) >> 9, (flags & 0x0100) >> 8, (flags & 0x0080) >> 7, (flags & 0x0040) >> 6, (flags & 0x0020) >> 5, (flags & 0x0010) >> 4, (flags & 0X000F) ); printf("Qdcount : %d\n", ntohs(hdr->qdcount)); printf("Ancount : %d\n", ntohs(hdr->ancount)); printf("Nscount : %d\n", ntohs(hdr->nscount)); printf("Arcount : %d\n", ntohs(hdr->arcount)); } free(buffer); close(sockfd); return 1; }