2013-01-31 11 views
6

(Scusatemi se non sono in grado di mettere correttamente alla domanda. Inglese nella non la mia lingua principale.)modo corretto di analizzare i pacchetti di rete in C

sto cercando di analizzare Synce ESMC pacchetto. È un pacchetto di protocollo lento Ethernet.

Approccio 1: Per analizzare questo pacchetto, ho utilizzato un approccio byte per byte simile a quello che è stato fatto here.

Approccio 2: Un altro modo per analizzare il pacchetto consiste nel definire una "struttura" per rappresentare l'intero pacchetto e accedere ai singoli campi per recuperare il valore in corrispondenza di uno specifico offset. Tuttavia in questo approccio struttura padding e allineamento possono entrare in immagine (che non sono sicuro) ma su Linux varie intestazioni di pacchetti sono definite in forma di struttura, ad es. iphdr in ip.h. I pacchetti IP (buffer) possono essere digitati su 'iphdr' per recuperare i campi dell'header ip, quindi deve funzionare.

Quale approccio è meglio analizzare un pacchetto di rete in C?

Il riempimento e l'allineamento della struttura fanno alcuna differenza durante l'analisi di un pacchetto tramite l'approccio 2? Se sì, in che modo le intestazioni Linux hanno superato questo problema?

+0

Tutti i compilatori dispongono di funzionalità per non eseguire il rilievo delle strutture o allineare i campi dei membri e si possono anche utilizzare campi bit per campi più brevi e un byte. –

+0

@JoachimPileborg - quale approccio sarebbe meglio, portabile ed efficiente? – Abhirav

+0

Portatile tra compilatori, sistemi operativi, hardware o una combinazione di questi? Più efficiente come nel veloce, utilizzando meno memoria o altri criteri? Entrambi gli approcci hanno dei meriti, e quale dipende da "il migliore" dipende molto dai tuoi obiettivi. –

risposta

1

L'approccio 1 è il migliore per la portabilità. Permette di evitare in modo sicuro gli accessi disallineati, ad esempio. In particolare, se la tua macchina è little-endian, questo approccio ti consente di occuparti dello scambio dei byte molto facilmente.

L'approccio 2 è talvolta conveniente e spesso è il codice più veloce da scrivere. Se il riempimento della struttura ti ostacola, il tuo compilatore probabilmente fornisce un flag o un attributo (come __attribute__((__packed__)) o #pragma pack) per aggirare il problema. Se si dispone di una macchina little-endian, tuttavia, sarà comunque necessario eseguire il byteswap dei campi dappertutto.

+0

grazie per consise e risposta precisa! – Abhirav

Problemi correlati