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));
Zeigen Sie mehr Code, mit 3 Zeilen Code können wir nicht helfen. –
Ich habe den vollständigen Teil mit dem ICMP-Paket hinzugefügt. –