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