Προς το περιεχόμενο

C\C++ Παράδοξο ??


m8xlmus

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα παιδιά, προσπαθώ να γράψω ένα προγραμα σε C και εδώ και 2 μερες με ταλαιπωρεί κάτι πολύ κουφό. Το πρόγραμμα είναι αναλυτής δικτύου και χρησιμοποιώ winpcap αλλά το πρόβλημα είναι γενικής φύσεως(..πιστεύω). Λοιπόν ο κώδικας μου είναι ο εξής:

 

/* το μέγεθος (σε bytes) των διευθύνσεων ethernet */

#define ETHER_ADDR_LEN 6

/* το μέγεθος των επικεφαλίδων ethernet */

#define ETHER_H_LEN 14

 

/* ARP Header */

typedef struct {

u_short arp_ht; /* hardware type */

u_short arp_pt; /* protocol type */

u_char arp_hs; /* hardware size */

u_char arp_ps; /* protocol size */

u_short arp_op; /* operation code */

#define ARP_REQ 0x0001 /* op request */

#define ARP_REPLY 0x0002 /* op reply */

u_char arp_smac[ETHER_ADDR_LEN]; /* <<<<<--- εδώ αρχίζει το κουφό */

u_long arp_src; /* sender's ip address */

u_char arp_dmac[ETHER_ADDR_LEN];

u_long arp_dst;

}arp_h;

 

και στο "κυρίως" πρόγραμα χρησιμοποιώ την παράνω δομή (όπως και πολλές άλλες) για να πάρω τις πληροφορίες που θέλω από το ολοκληρωμένο πακέτο (const u_char *pkt_data) :

 

void afunction(....., ....., const u_char *pkt_data){

 

const arp_h *arph;

 

arph = (arp_h*) (pkt_data + ETHER_H_LEN);

:

:

printf("...")

:

κτλ

}

 

Αν τώρα τα bytes πχ που δείχνει ο (pkt_data + ETHER_H_LEN) είναι αυτά:

 

00000 00 00 00 00 00 00 00 00 dd dd dd dd dd dd ee ee

00010 ee ee bb bb bb bb bb bb cc cc cc cc

 

 

θα περιμέναμε:

arph->arp_smac == dd dd dd dd dd dd ,

και arph->arp_src == ee ee ee ee ,

κτλ κτλ..

 

Έλα όμως που για κάποιο περίεργο λόγο:

ναι μεν arph->arp_smac == dd dd dd dd dd dd ,

αλλά arph->arp_src == ee ee bb bb (πηδάει 2 bytes)

 

 

Αν όμως αντικαταστήσω το u_long arp_smac;

με u_char arp_smac[4]; όλα κομπλέ!!

 

..αν πάλι αντί για u_long το δηλώσω u_int πάλι τα ίδια!!

 

...????

 

Δέν έχω εμπειρία στη C/C++ άλλα απ' όσο ξέρω και απ' ότι βλέπω (με την sizeof) το μέγεθος ενός u_long/u_int είναι 4 bytes! Δεν θα έπρεπε να έχει το ίδιο αποτέλεσμα με ένα πίνακα χαρακτήρων 4 bytes?? Την ίδια ακριβώς τεχνική τη χρησιμοποιώ 10δες φορές στο πρόγραμμα μου και δεν έχω κανένα πρόβλημα. Μπορώ να του δηλώσω u_char[] αφού του αρέσει καλύτερα αλλά με ανυσηχεί λίγο γιατί στην πορεία δεν θα ξέρω..."πετυχε το typecast ή δεν πέτυχε? ισχύουν αυτα που βλέπω στην οθόνη ή όχι?".

Ευχαριστώ πολύ για το χρόνο σας!

Δημοσ.

Χε! Alkisg πάνω στο άρθρο έιχα πέσει ψάχνοντας για το συγκεκριμένο θέμα αλλά δεν φαντάστηκα ότι ήταν η απάντηση! Τελικά δεν είναι και τόσο παράδοξο ε... :) Thanx...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...