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
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: