DNS A-Record

  • Themenstarter Themenstarter ati
  • Beginndatum Beginndatum
A

ati

Hallo Leute,

Ich muss ein Programm erstellen welches eine DNS abfrage macht.

Nun hänge ich beim zusammenstellen des Paketes, welches ich an den Server schicken will. Ich will ihm sagen das ich den DNS header schicke, die adresse welche ich aufgelöst haben möchte und die art, also A-Record usw.

Das Programm hängt sich in der jetzigen Version auf nachdem ich die adresse eingebe welche ich am server von dem ich die ip schon herausgefunden habe abfragen will.

Ich hoffe ihr könnt mir helfen das Paket richtig zusammenzustellen damit das endlich funktioniert.

Anbei der Sourcecode
C++:
/* Includes */
#include <stdio.h>
#include <errno.h>
#include <time.h>
#include "dns.h"

#ifdef _WIN32
/* Headerfiles für Windows */
#include <winsock.h>
#include <winsock2.h>
#include <io.h>
// link with Ws2_32.lib
#else
/* Headerfiles für Unix/Linux */     // Unter Windows sind ein Paar der folgenden 
                                     // Libraries nicht notwendig.
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#define closesocket(s) close(s)
#endif

#define A_TYPE     1
#define INET_CLASS  1

using namespace std;
/* DNS A-Record Programm */

/* Delay */
void delay(int i)
{
    i = i*3000;
    int a;
    for (a = 0; a<= i; a++)
    {}
    i = 0;
    return;
}

/* DNS UDP Paket senden und empfangen*/
int DNSpaket (int s, char* hostname)
{
    int bytes;
    int i, lastpoint;	
    char buffer2[BUFSIZ];
    struct dnsheader paket;
   	paket.transaction_id      = 0;
	paket.flags               = STANDARD_QUERY_FLAGS;
	paket.question_count      = htons( 1 );
	paket.answer_rr_count     = 0;
	paket.nameserver_rr_count = 0;
	paket.additional_rr_count = 0;

    bytes = sizeof(paket);
    memcpy( buffer2, (void*)&paket, bytes );
    printf("Hostname der auf dem DNS-Server abgefragt werden soll: ");
    scanf("%s", hostname);    
    printf("\n\n ");
    for ( i = lastpoint = 0; i < strlen( hostname ); i++ )
    {
        if ( hostname[ i ] == '.' )
	    {
	    buffer2[ bytes++ ] = i - lastpoint; 
	    memcpy( buffer2 + bytes, hostname + lastpoint, i - lastpoint );
        bytes += ( i - lastpoint );
	    lastpoint = i + 1;
        }
	}
	buffer2[ bytes++ ] = 0;
	buffer2[ bytes++ ] = A_TYPE;
	buffer2[ bytes++ ] = 0;
	buffer2[ bytes++ ] = INET_CLASS;
    
    /* Paket senden */
   	bytes = send( s, buffer2, bytes, 0 );
	if ( bytes == -1 )
		return -1;
	printf("Status: Anfrage gesendet \n");
	
    /* Paket empfangen */
	bytes = recv( s, buffer2, sizeof( buffer2 ) - 1, 0 );
	if ( bytes == -1 )
		return -1;
	printf("Status: Antwort erhalten \n\n");
    	
    /* Vergleich der Transaction ID */
    printf("ID check: ");
    if ( ( (struct dnsheader*)buffer2 )->transaction_id != paket.transaction_id )
		return -1;
	else {
    printf("OK");
    }

    /* Ausgabe des empfangenen Pakets */
	/*print_dns_answers( buffer, bytes );
	return 0; */
}

/*Hauptprogramm */
int main (int argc, char** argv )
{
	int s;
	struct sockaddr_in addr;
	struct hostent* h;
	char  buffer[BUFSIZ];
	char* tmp;
	WSADATA wsaData;
    	
	printf("DNS A-Record Programm \n=====================\n\n");
	
    /* Initialisieren */
	if (WSAStartup(MAKEWORD(1, 1), &wsaData)) {
		fprintf(stderr, "Error: WSAStartup failed.\n");
		return 1;
	}  
    printf("Winsock initialisiert... \n\n");
    delay(100000);

	/* Socket erstellen */
    s = socket( AF_INET, SOCK_DGRAM, 0 );
	if ( s == -1 )
	{
		perror( "Error: socket failed.\n");
		return 2;
	}
	printf("Winsock erstellt... \n\n");	
    delay(100000);
    
    /* Adresse auf IP übersetzen (gethostbyname) */
   	if (argc == 1) {
	    printf("Hostname zu dem eine DNS-Abfrage gesendet werden soll: ");
	    fgets(buffer, sizeof(buffer), stdin);
	    printf("\n\n");
	    if ((tmp = strchr(buffer, '\n')) != NULL)
           *tmp = '\0';
		   h = gethostbyname(buffer);
	}
	else {
		h = gethostbyname(argv[1]);
	}
	if (h == NULL) {
		fprintf(stderr, "Error: gethosbyname failed.\n");
		WSACleanup();
		return 3;
	}
	addr.sin_addr = *(struct in_addr*) h->h_addr;
	addr.sin_port     = htons( 53 );
	addr.sin_family   = AF_INET;	
    printf("Die IP der eingegebenen Adresse ist: %s", inet_ntoa(addr.sin_addr));
	printf("\n\n");
    //WSACleanup();
    
    /* Verbinden */
   	if ( connect( s, (struct sockaddr*)&addr, sizeof( addr ) ) == -1 )
	{
		perror( "Error: connect failed.\n" );
		return 4;
	}   
	
	/* Aufruf der Funktion DNSpaket */
	if ( DNSpaket( s, argv[ 2 ] ) == -1 )
	{
		fprintf( stderr, "%s: Error: in handling.\n", argv[ 0 ] );
		return 5;
	}
	
    /* Socket schließen */
    close(s);

    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Zuletzt bearbeitet von einem Moderator:
Packe doch erstmal deinen Code in die entsprechenden Tags:

[code=cpp]Your code[/code]

(Natürlich ohne Lücken)
 
Zuletzt bearbeitet:
back to topic :P
hat schon jemand eine idee wie ich das Problem lösen kann? :(

Ich habe jetzt ein wenig probiert durch auskommentieren auf den Fehler zu kommen.
Es hat scheinbar irgendwas mit der Variablen "hostname" zu tun, aber ich weiß nicht wo der Fehler liegt.
 
Hallo,

wieso versuchst du denn in der Funktion DNSpaket den Hostnamen vom Benutzer abzufragen, wenn du ihn doch im Aufruf aus der Mainfunktion schon übergibst?

Grüße,
Matthias
 
ich möchte an die ip die ich abgefragt habe ein DNS a-record schicken mit dem hostnamen den ich abfragen will.
daher mache ich die abfrage für den hostnamen.
könntest du mir eventuell das programm richtigstellen wo du einen fehler siehst?
 
Zurück