2011-06-24 14 views
6

Chcę wygenerować pakiet sieciowy do wysłania (na przykład) portu 123 do serwera NTP, aby móc odbierać i analizować zwracany pakiet. Celem jest lepsze zrozumienie, w jaki sposób pakiety są generowane, czytane i odpowiadane przez systemy sieciowe.Jak wygenerować pakiety sieciowe za pomocą C/C++

(1) Czy należy użyć struct do wygenerowania pakietu?

(2) Nie jestem pewien, jak poprawnie wypełnić różne pola w strukturze; na przykład, czy adresy IP źródła i miejsca docelowego powinny być ustawione za pomocą wartości szesnastkowych? Czy może jest bardziej przyjazny człowiekowi sposób?

(3) Następnie, po wypełnieniu pól, struktura może zostać wysłana przez send()/write() przez połączenie UDP do serwera NTP? (lub TCP, jeśli protokół tego zażąda)

Czy moje podejście jest uzasadnione? Czytałem RFC NTP, ale nadal nie jestem pewien, co mój klient powinien wysyłać na serwer (np. Adres IP, czy nie powinien tego zrobić nagłówek warstwy sieciowej?) Modelowałem ten NTP struct po przykładzie "nadawania" w dodatku A do RFC 5905. Przepraszam, jeśli moje pytanie jest źle sformułowane lub zbyt długie. Z góry dziękuję za pomoc. Przykładowy kod poniżej pożycza od kodu przykład w dokumencie RFC 5905.

typedef unsigned long ipaddr;  //32 bits (4 bytes) 
typedef signed char s_char;  //character type as number, -128..127 
typedef unsigned int tdist;  //character type as number, 0..255 
typedef unsigned long long tstamp; //64 bits (8 bytes) 
typedef unsigned long digest;  //32 bits (4 bytes) 

struct Ntp { 
    ipaddr dstaddr; 
    ipaddr srcaddr; 
    char version; 
    char leap; 
    char mode; 
    char stratum; 
    char poll; 
    s_char precision; 
    tdist rootdelay; 
    tdist rootdisp; 
    char refid; 
    tstamp reftime; 
    tstamp org; 
    tstamp rec; 
    tstamp xmt; 
    int  keyid; 
    digest dgst; 
} Ntp; 

int main() 
{ 
    struct Ntp packet; 

    //packet.dstaddr=WHAT_GOES_HERE; 
    //... 
    //... 
    //packet.dgst=WHAT_GOES_HERE; 

    return 0; 
} 
+2

Czy na pewno twoja struktura 'Ntp' nie jest nieprzewidywalna? –

+1

"jeśli źródłowy i docelowy adres IP będą ustawione za pomocą wartości szesnastkowych" - z pewnością nie, chociaż byłyby preferowane przy korzystaniu z IPv6. C ma literały dziesiętne, funkcje analizy dziesiętnej i funkcje analizy IP (zależne od platformy, sprawdź w podręczniku systemu operacyjnego). –

+1

Może zajść potrzeba dopasowania endianu do dowolnych wielobajtowych wielkości wysyłanych przez przewód, co jest kolejnym powodem, dla którego należy unikać wysyłania całej struktury w jednym zapisie. –

Odpowiedz

2

Nie wydaje się mieć wiele protokołów sieciowych pisanie doświadczenie. Zgłaszanie struktury i zapisywanie jej nie jest drogą do zrobienia. Ja również wskazać na http://fixunix.com/ntp/257876-any-samples-ntp-sntp-client-code.html i specjalnie wywołać następujące punkty:

  • Dlaczego chcesz się toczyć własne w stosunku do uruchomienia jednego z istniejących pakietów?

  • Jednym z problemów przy pisaniu klienta NTP jest uzyskanie odpowiedniego czasu.

  • Drugi to nie zepsucie reszty sieci ani nieuzasadnione obciążenie serwerów.

W każdym razie, jak to omówiono w wątku zwróciłem Ci, chcesz używać SNTP i należy przyjrzeć się realizacji odniesienia SNTP w ntp archiwum wskazać drogę i pomoże Ci zorientować się, co powinieneś robić.

+0

Dziękuję za odpowiedź; moim celem jest lepsze zrozumienie, w jaki sposób pakiety są wysyłane, czytane i odpowiadane przez systemy w sieci (na najbardziej podstawowym poziomie). Nie próbuję tworzyć publicznie użytecznego klienta - chcę tylko wysłać pakiet zgodny z protokołem. W tym przypadku NTP; Wybrałem to, ponieważ pomyślałem [być może błędnie], że byłby to bardziej realistyczny cel. Przypuszczam, że moje pytanie nie jest trafne w reklamowaniu mojego celu i przepraszam za jakiekolwiek zamieszanie; dziękuję za konstruktywną odpowiedź - będę odpowiednio edytować moje pytanie. – shelladept

Powiązane problemy