Originariamente inviato da Andre00
il mio problema sono i puntatori e lo sono sempre stati... non riesco a capirne il funzionamento.
una volta spunta un asterisco qui e la che sembra significare un contenuto invece e un indirizzo insomma una confusione immane
Beh ... questo e' un grosso problema per chi vuole programmare in C (in generale) ed e' un enorme problema per chi vuole scrivere programmi del tipo di cui stai parlando.

Questo perche' il puntatore e' lo strumento "principe" di un linguaggio come il C ed e' lo strumento "fondamentale" per la programmazione di rete ...

Se non hai chiarissimo il funzionamento dei puntatori, il mio consiglio e' di fermarti e studiarli a partire da zero (con un bel libro e con gli esempi passo passo di difficolta' crescente).
Ignorare l'argomento o sottovalutarlo nello studio, non ti porta da nessuna parte. Troverai sempre un "puntatore" da qualche parte, che ti fara' diventare matto (in realta', al contrario di quello che sembra, il "puntatore" e' un concetto molto semplice ...).

ma dire al puntatore ip di puntare alla struttura iphrd e porlo uguale all'indirizzo del buffer che vuol dire?
Un puntatore e' solamente l'indirizzo di un'area di memoria. Ma l'area di memoria deve esistere.

Con quella linea hai detto che l'area di memoria esistente a cui far riferimento e' l'array di 8K di caratteri

buffer

e che questa area NON e' solamente una sequenza di caratteri ma una struttura del tipo indicato dal puntatore che ne detiene l'indirizzo.

E poi io avrei fatto così per realizzare quello che dici tu:

struct iphdr *ip = &buffer;
Questa linea non e' corretta per due motivi.

Intanto, come dovresti sapere, nel caso di un array, il nome dell'array *equivale* al suo indirizzo. Quindi, scrivere buffer o &buffer e' la stessa cosa. Ecco perche'

struct iphdr *ip = buffer;

Come seconda cosa, essendo stato dichiarato buffer come "vettore di caratteri" e non come "struttura iphdr", questa scrittura avrebbe fatto generare al compilatore un warning in quanto il "tipo di dato a cui punta" il puntatore deve essere congruente con quello che sta a destra.

Dato che il puntatore punta a un dato di tipo "struct iphdr", allo stesso tipo di dato deve puntare il puntatore di destra. Dato che il puntatore buffer punta ad un "vettore di char" e' necessario far sapere al compilatore che va bene comunque in quanto il buffer verra' trattato come se fosse una "struttura iphdr" e questo fatto si indica tramite il

cast

(altro argomento che dovrai ripassare).

La forzatura del tipo di puntatore che sta a destra (il cast) si scrive cosi' ...

struct iphdr *ip = (struct iphdr *) buffer;