J'ai essayé d'écrire un petit programme traceroute propre en C pour Linux en utilisant des sockets raw, mais quand je compile, je reçois le message d'erreur "dereferencing pointeur vers type incomplet "struct ip
.Erreur "déréférencer le pointeur vers le type incomplet" en essayant d'écrire à une structure
Ce sont les en-têtes Inclure:
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <ifaddrs.h>
puis comment j'utiliser l'en-tête IP
struct ip *myIpHeader = (struct ip*)buffr;
suivi d'un tas de choses ... alors:
myIpHeader->ip_v = 4;
myIpHeader->ip_hl = 5;
myIpHeader->ip_tos = 0;
myIpHeader->ip_len = 20+8;
myIpHeader->ip_off = 0;
myIpHeader->ip_p = IPPROTO_ICMP;
inet_pton(AF_INET, argv[1], &(myIpHeader->ip_dst));
inet_pton(AF_INET, ownip->h_name, &(myIpHeader->ip_src));
myIpHeader->ip_sum = 0;
myIpHeader->ip_id = htonl(12345);
myIpHeader->ip_ttl = ttl;
Et puis je l'utilise pour l'envoi:
sendto(mysock, buffr, sizeof myIpHeader + sizeof myicmphead, 0, (struct sockaddr*)&cliAddr, sizeof cliAddr);
Afficher la définition et la déclaration complètes, vous avez probablement déclaré une structure sans nom. –
Non, vous ne pouvez pas avoir de pointeur vers un type de structure anonyme sans que le type référencé soit terminé, car vous ne pouvez pas référencer un type de structure anonyme en dehors de la portée de sa définition. Parce que c'est, tu sais, anonyme. –
Mais vous * pouvez * avoir un pointeur vers un type de structure nommé dont la définition n'est pas dans la portée. Vous pouvez contourner un tel pointeur, mais ne pas le déréférencer. –