Я хочу сгенерировать сетевой пакет для отправки (например) через порт 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;
}
Ntp
не дополняется непредсказуемым образом? - person Kerrek SB   schedule 25.06.2011echo protocol
- person This   schedule 25.06.2011