2017-10-09 4 views
-1

Seit ein paar Tagen arbeite ich mit Paketen auf c, ich habe erfolgreich erstellt icmp Paket zu senden, aber ich habe nicht den Weg, um es in die Steckdose von mir selbst, so Ich habe mehrere Codes gefunden, die ähnliche Aktionen ausführen sollten. Sie enthalten also den Teil, den ich nicht vollständig verstehe und ich kann keine Informationen darüber finden. Sie werfen Strukturen mit Paket an einen char-Zeiger, so etwas wie dieses:Casting-Strukturen zu den Zeigern

static char *packet; 
    ip= (struct iphdr*) packet; 
    icmp= (struct icmphdr*)(ip+1); 

Als ich versucht habe, dies ich die Segmentierungsfehler bekommen haben. Bitte erläutern Sie mir den Zweck der Casting-Strukturen und warum das gleiche Stück Code in meinem Fall nicht funktioniert. Vielen Dank.

struct iphdr *ip; 
struct icmphdr *icmp; 

ip=malloc(sizeof(*ip)); 
icmp=malloc(sizeof(*icmp)); 

int sock; 

uint16_t psize = sizeof(*icmp)+sizeof(*ip); 
static char *packet; 
ip= (struct iphdr*) packet; 
icmp= (struct icmphdr*)(ip+1); 

unsigned int id = (unsigned int)rand(); 
unsigned int seq = (unsigned int)rand(); 

ip->version = 4; 
ip->ihl = 5; 
ip->tos = 0; 
ip->tot_len = htons(psize); 
ip->id = id; 
ip->frag_off = 0; 
ip->ttl = 255; 
ip->protocol = IPPROTO_ICMP; 
ip->saddr = subnet.ipDec; 
icmp->type = 8; 
icmp->code = 0; 
icmp->un.echo.id=id; 
icmp->un.echo.sequence=seq; 
icmp->checksum=0; 

sock=socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); 
struct sockaddr_in destIP; 
destIP.sin_family=AF_INET; 
uint32_t destIPDec=0; 
ip->daddr = destIPDec; 
destIP.sin_addr.s_addr=destIPDec; 
sendto(sock, packet, psize, 0, (struct sockaddr*) &destIP, sizeof(destIP)); 
+0

Zeigen Sie mehr Code, mit 3 Zeilen Code können wir nicht helfen. –

+1

Ich habe den vollständigen Teil mit dem ICMP-Paket hinzugefügt. –

Antwort

2

Wenn Sie eine packet erstellen möchten, müssen Sie eine Stück Speicher zuweisen und nicht zu den 'Substrukturen'. Sie haben

ip=malloc(sizeof(*ip)); 
icmp=malloc(sizeof(*icmp)); 

int sock; 

uint16_t psize = sizeof(*icmp)+sizeof(*ip); 
static char *packet; 
ip= (struct iphdr*) packet;  // here you access undefined pointer packet; previous contents of ip is lost 
icmp= (struct icmphdr*)(ip+1); // same for icmp 

entfernen te malloc() s Sie haben und es ändern zu

---- 
static char *packet; 

packet = malloc(sizeof *ip + sizeof *icmp); 
ip= (struct iphdr*) packet; 
icmp= (struct icmphdr*)(ip+1); 
+0

Danke, verstanden. –

2

Es EDITED ist ein grundlegender Fehler im Code.

Hier weisen Sie Speicher für zwei Variablen

ip=malloc(sizeof(*ip)); 
icmp=malloc(sizeof(*icmp)); 

aber bald, nachdem Sie

static char *packet; 
ip= (struct iphdr*) packet; 
icmp= (struct icmphdr*)(ip+1); 

tun also ip und icmp nicht mehr zeigte auf den zugewiesenen Speicher. Stattdessen haben Sie ihnen den Wert einer nicht initialisierten Variable zugewiesen, d. H. packet. Das ist undefiniertes Verhalten und erklärt den Seg-Fehler.

1

Das Problem tritt auf, wenn Sie Werte ip und icmp sind zuweisen. Ich empfehle folgenden Code:

struct packet { 
    struct iphdr ip; 
    struct icmphdr icmp; 
} myPacket; 

myPacket = (struct packet*)malloc(sizeof(struct packet)); 

ip =(struct iphdr*) &packet.ip; 
icmp = (struct icmphdr*) &packet.icmp;