int handleRequest(struct dnsServer *srv, int len) { struct DNSHeader head; struct DNSQuestion question; struct DNSAnswer answer; int8_t *ptr = srv->buffer; char *addr, *buf = NULL; uint16_t size; uint8_t found = 0; ptr = readDNSHeader(&head, ptr); ptr = readDNSQuestion(&question, ptr); if (question.qtype == TYPE_A) addr = resolveHost(question.qname); else if (question.qtype = TYPE_PTR) addr = resolveAddress(question.qname); #if DEBUG == 1 printf("Received packet from %s:%d\tID: %04x\n", inet_ntoa(srv->client.sin_addr), ntohs(srv->client.sin_port), head.id); printf("NAME TO RESOLVE: %s\t%s\n", question.qname, addr); #endif if ((question.qtype != TYPE_A && question.qtype != TYPE_PTR || question.qclass != CLASS_IN) || addr == NULL) { passthrough(srv, len); } else { answer = createDNSAnswer(&question, addr, question.qtype == TYPE_A); createDNSResponse(&head, &question, &answer, (void **)&buf, &size); sendto(srv->sock, buf, size, 0, (struct sockaddr*)&srv->client, sizeof(srv->client)); } return 0; //packet sent }
int main(int argc, char *argv[]) { // set working directory char path[128]; int lenPath = 0; char *tmp = argv[0], *pos; while (1) { pos = strchr(tmp, '/'); if (pos == NULL) break; lenPath += pos - tmp + 1; tmp = pos + 1; } strcpy(path, argv[0]); path[lenPath] = '\0'; int d = open(path, O_RDONLY); fchdir(d); // read config.txt char str[64]; FILE *fp; if ((fp = fopen("../config/config.txt", "r")) == NULL) { printf("Read config error\n"); return -1; } // read and bulid hashtable initHashTable(); while (!feof(fp)) { fgets(str, 64, fp); char name[64], ip[64]; char *ptr; int lenIP = strchr(str, ' ') - str; int lenName; if (strchr(str, '\n') != NULL) { lenName = strchr(str, '\n') - strchr(str, ' ') - 1; } else { lenName = strlen(str) - lenIP - 1; } ptr = str; for (int i = 0; i < lenIP; i++, ptr++) { ip[i] = *ptr; } ip[lenIP] = '\0'; ptr += 1; for (int i = 0; i < lenName; i++, ptr++) { name[i] = *ptr; } name[lenName] = '\0'; // printf ("%s --> %s\n", name, ip); add(name, ip); } fclose(fp); dispalyTable(); // bulid socket int sockfd; struct sockaddr_in serverAddr, clientAddr; sockfd = socket(AF_INET, SOCK_DGRAM, 0); bzero(&serverAddr, sizeof(struct sockaddr_in)); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); serverAddr.sin_port = htons(PORT); if (bind(sockfd, (struct sockaddr *)(&serverAddr), sizeof(serverAddr)) == -1) { printf("Bind Fail\n"); printf("%s\n", strerror(errno)); return -1; } printf("***************************************\n"); printf("Bind Success!\n"); printf("***************************************\n"); printf("listening port %d\n", PORT); // recive message from clients char message[1024]; while (1) { socklen_t len; len = sizeof(clientAddr); recvfrom(sockfd, message, sizeof(message), 0, (struct sockaddr *)(&clientAddr), &len); //handle message from clients char name[64]; memset(name, 0, sizeof(name)); printDNSQuery(message, name); HashNode* ans = search(name); if (ans) { printf("%s\n", ans->ip); char dnsAnswer[1024]; createDNSAnswer(ans->ip, dnsAnswer, message); sendto(sockfd, dnsAnswer, sizeof(dnsAnswer), 0, (struct sockaddr *)&clientAddr, sizeof(clientAddr)); } else { printf("DNS request timed out.\n"); } } return 0; }