Я хочу сгенерировать сетевой пакет для отправки (например) через порт 123 на сервер NTP, чтобы я мог получить и проанализировать возвращенный пакет. Цель состоит в том, чтобы лучше понять, как сетевые системы генерируют, читают и отвечают на них.
(1) Следует ли использовать структуру для генерации пакета?
(2) Я не уверен, как правильно заполнить различные поля в структуре; например, следует ли указать IP-адреса источника и назначения с шестнадцатеричными значениями? Или есть более удобный для человека способ?
(3) Затем, после заполнения полей, можно ли отправить структуру через send () / write () по UDP-соединению на NTP-сервер? (или TCP, если этого требует протокол)
Разумен ли мой подход? Я читал NTP RFC, но все еще не уверен, что мой клиент должен отправлять на сервер (например, IP-адрес; не следует ли об этом позаботиться с помощью заголовка сетевого уровня?) Я смоделировал этот NTP struct после примера «передачи» в Приложении A к RFC 5905. Прошу прощения, если мой вопрос сформулирован плохо или слишком длинный. Спасибо заранее за любую помощь. Приведенный ниже пример кода заимствован из примера кода из 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;
}