Как сгенерировать сетевые пакеты с помощью C / C ++

Я хочу сгенерировать сетевой пакет для отправки (например) через порт 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;
}
6
задан shelladept 25 June 2011 в 01:33
поделиться