2013-01-31 7 views
6

(Przepraszam jeśli nie jestem w stanie postawić pytanie poprawnie. Angielskiego w nie mój język podstawowy).Prawidłowy sposób analizowania pakiet sieciowy w C

Próbuję analizować pakiet synce ESMC. Jest to pakiet protokołu powolnego Ethernetu.

Podejście 1: Do parsowania tego pakietu użyłem metody bajt po bajcie podobnej do tej, którą wykonano here.

Podejście 2: Innym sposobem na przeanalizowanie pakietu byłoby zdefiniowanie "struktury" reprezentującej cały pakiet i uzyskanie dostępu do poszczególnych pól w celu pobrania wartości w określonym przesunięciu. Jednak w tym podejściu struktura może zawierać dopełnienie i wyrównanie (co nie jest pewne), ale w systemie Linux różne nagłówki pakietów są definiowane w formie struktury, np. iphdr w ip.h. Pakiety IP (bufor) można odlewać do 'iphdr', aby pobrać pola nagłówków ip, więc musi działać.

Które podejście lepiej przeanalizować pakiet sieciowy w C?

Czy dopełnienie i zmiana struktury mają znaczenie podczas analizowania pakietu za pomocą podejścia 2? Jeśli tak, w jaki sposób nagłówki linuksowe przezwyciężyły ten problem?

+0

Wszystkie kompilatory mają funkcjonalność do blokowania struktur lub wyrównywania pól elementów, a także do użycia pól bitowych dla pól krótszych o jeden bajt. –

+0

@JoachimPileborg - które podejście byłoby lepsze, portabale i efektywne? – Abhirav

+0

Przenośne między kompilatorami, systemami operacyjnymi, sprzętem lub ich kombinacją? Wydajniejsza, szybka, zużywająca mniej pamięci lub inne kryteria? Oba podejścia mają zalety, a który jest "najlepszy" zależy w dużej mierze od twoich celów. –

Odpowiedz

1

Podejście 1 jest najlepsze dla przenośności. Pozwala to na przykład na uniknięcie niedopasowanych wejść. W szczególności, jeśli twoja maszyna jest mało-endianowa, to podejście pozwala bardzo łatwo zająć się zamianą bajtów.

Podejście 2 jest czasami wygodne i często jest szybsze do napisania. Jeśli dopełnienie struktury przeszkadza, kompilator prawdopodobnie zapewnia flagę lub atrybut (np. __attribute__((__packed__)) lub #pragma pack) do obejścia tego. Jeśli jednak masz maszynę typu little-endian, nadal będziesz musiała pole bajtów w każdym miejscu.

+0

dzięki za konsystencję i dokładną odpowiedź! – Abhirav

Powiązane problemy