Newsgroup: it.comp.lang.c
Titolo: in parole povere

Salve.
Scusate la banalita' della domanda ma come leggete in parole
queste due righe?
iph = (struct iphdr *)packet
tcph = (struct tcphdr *)(packet + sizeof(struct iphdr))
Io pensavo di interpretarle come:
"iph punta alla locazione di memoria di packet dopo n byte occupati
 dalla struct iphdr"
"tcph punta alla locazione di memoria di packet dopo n byte occupati
 dalle struct tcphdr+iphdr"
 
Ho ragione ?
grazie. 

 wrote:
: Salve.
: Scusate la banalita' della domanda ma come leggete in parole
: queste due righe?
: iph = (struct iphdr *)packet
: tcph = (struct tcphdr *)(packet + sizeof(struct iphdr))
: Io pensavo di interpretarle come:
: "iph punta alla locazione di memoria di packet dopo n byte occupati
:  dalla struct iphdr"
iph punta a packet che e' castato ad una struttura iphdr
: "tcph punta alla locazione di memoria di packet dopo n byte occupati
:  dalle struct tcphdr+iphdr"
tcph punta a packet + iphdr che e' castato ad una struttura tchdr
:  
: Ho ragione ?
no :)
bye
-- 
  --==> ALoR <==---------------------- -  -   -
  ettercap project: 
http://ettercap.sourceforge.net
  e-mail: alor (at) users (dot) sourceforge (dot) net    

 : tcph = (struct tcphdr *)(packet + sizeof(struct iphdr))
questo e ancora piu tremendo, perche senza sapere il tipo del packet non si
sa a che cosa punta (dopo l'assegnazione del valore).
allora packet + sizeof(struct iphdr) sara un offset da packet con
offset=sizeof(struct iphdr)*sizeof(<tipo di packet>)
piu chiaro sarebbe:
tcph = ((struct tcphdr *)packet) + sizeof(struct iphdr);
tutt'altro che banale la domanda :-)
J.

 wrote:
:> : Salve.
:> : Scusate la banalita' della domanda ma come leggete in parole
:> : queste due righe?
:>
:> : iph = (struct iphdr *)packet
:> : tcph = (struct tcphdr *)(packet + sizeof(struct iphdr))
:>
:> : Io pensavo di interpretarle come:
:>
:> : "iph punta alla locazione di memoria di packet dopo n byte occupati
:> :  dalla struct iphdr"
:>
:> iph punta a packet che e' castato ad una struttura iphdr
: non mi sembra giusto...
: la tua definizione sarebbe:
:     iph = (struct iphdr *) &packet; // iph contiene lo stesso valore di
: packet
ho supposto che packet fosse un u_char *packet.
e la cosa avrebbe avuto senso...


 e la cosa avrebbe avuto senso...
Mi dispiace: non avrebbe avuto senso!!!!
Diciamolo allora cosi per capire la differenza:
iph punta a quello a cui puntava packet (che e' castato ad una struttura
iphdr)
u_char *packet = "hello world packet";
iph = (struct iphdr *)packet;
iph punta a "hello world packet" e non al L-Value di packet; (l'indirizzo di
packet e: &packet)...
J.

 wrote:
:> : tcph = (struct tcphdr *)(packet + sizeof(struct iphdr))
: questo e ancora piu tremendo, perche senza sapere il tipo del packet non si
: sa a che cosa punta (dopo l'assegnazione del valore).
perche' tremendo ?
se packet e' un char *packet (cosa molto probabile trattandosi di pacchetti tcp) e' perfettamente lecito...
: allora packet + sizeof(struct iphdr) sara un offset da packet con
: offset=sizeof(struct iphdr)*sizeof(<tipo di packet>)
esatto, ma ricorda, packet e' un char... ;)
: piu chiaro sarebbe:
: tcph = ((struct tcphdr *)packet) + sizeof(struct iphdr);
attento che qui si sposta di 20 x 20 byte !!!
cioe' tu prima lo casti ad una struttura di 20 byte, poi ti sposti di altre 20 strutture in avanti....
: tutt'altro che banale la domanda :-)
troppo complicata la tua risposta.. ;)


 troppo complicata la tua risposta.. ;)
Non troppo complicata la riposta, difficile scendere dalla semantica di un
'problema'... (subject: in parole povere)
;^)
J.

 wrote:
:> ho supposto che packet fosse un u_char *packet.
:> e la cosa avrebbe avuto senso...
: Mi dispiace: non avrebbe avuto senso!!!!
: Diciamolo allora cosi per capire la differenza:
: iph punta a quello a cui puntava packet (che e' castato ad una struttura
: iphdr)
: u_char *packet = "hello world packet";
: iph = (struct iphdr *)packet;
: iph punta a "hello world packet" e non al L-Value di packet; (l'indirizzo di
: packet e: &packet)...
forse dimentichi che se packet e' un char *
l'indirizzo e il nome sono la stessa cosa...
es:
memset(packet, 0, 20);
memset(&packet, 0, 20);
sono equivalenti se packet e' un array di char !!!


 sono equivalenti se packet e' un array di char !!!
Solo in questo caso...
Se definisco:
typedef struct
{
    char chunk[4];
    unsigned long length;
    char data[4096];
} PACKET;
PACKET packet;
le cose cambiano un po'... (e ripeto, il discorso era diverso, ed infondo si
tratta soltanto di capire la differenza tra l-value e r-value)...
;)
J.

 wrote:
:> perche' tremendo ?
:> se packet e' un char *packet (cosa molto probabile trattandosi di
: pacchetti tcp) e' perfettamente lecito...
: Nella programmazione non esiste 'cosa molto probabile'.
: Il compilatore non riconosce un tipo che sia molto probabile...
no, ma noi siamo umani, non compilatori.. noi abbiamo la fantasia e il buon senso per decidere che la dichiarazione fosse quella.
cmq se vuoi ostinarti, fai pure, per me la questione finisce qui.


Ho ragione ?
No.
packet e' sicuramente definito come puntatore o come vettore
(voto per questa seconda ipotesi), quindi:
iph e' un puntatore che punta allo stesso indirizzo di
packet.
Lo statement:
"tcph = (struct tcphdr *)(packet + sizeof(struct iphdr))"
e' invece equivalente a:
tcph = (struct tcphdr *)&packet[sizeof(struct iphdr)];
Il cui senso e' intuitivo.
--
Andrea Laforgia - walkietalkie(at)
libero.it
http://www.geocities.com/AndreaLaforgia

packet
No.  
Nel codice riportato dal nostro amico, packet e' sicuramente
definito come puntatore o come vettore, vedi lo statement
successivo.


successivo.
Potrebbe anche essere un intero (e il cast fare la terribile
e non portabile - ma spesso usata - conversione intero/pointer).
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

On Fri, 14 Sep 2001 10:35:35 GMT, 
ze...@email.it
 ([Z3n0K]) wrote:

Secondo me no. Mancano informazioni per essere precisi ma
dai nomi usati io sarei portato a pensare che packet sia
un puntatore a char (oppure addirittura un intero).
In questo caso il significato e': dato il pacchetto puntato
da 'packet' assegna a iph l'indirizzo dell'header ip (che
si trova all'inizio del pacchetto) e a tcph l'indirizzo
dell'header tcp (che si trova immediatamente dopo nel
pacchetto) dove iph e tcph sono puntatori a strutture
specifiche che permettono di accedere agevolmente ai
campi di questi header).
HTH
Andrea
PS:
 Se stai scrivendo l'n-esimo programma di nuke modificandone
 uno che nemmeno riesci a capire spero con tutto il cuore
 che ti venga una brutta malattia nota come "pecola" che
 ti provoca il distacco di tutta la pelle del sedere :)


 ti provoca il distacco di tutta la pelle del sedere :)
We, non sono mica un lamer !!!
Sto studiando le socket raw per una mia personale 
curiosita' e interesse. Niente di + !
grazie.