Как генерировать сетевые пакеты с C / C ++ - PullRequest
6 голосов
/ 25 июня 2011

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

1 Ответ

2 голосов
/ 25 июня 2011

Похоже, у вас нет большого опыта написания сетевых протоколов.Объявление структуры и ее запись - не самый лучший способ.Я также указываю вам на http://fixunix.com/ntp/257876-any-samples-ntp-sntp-client-code.html и, в частности, назовите следующие пункты:

  • Почему вы хотите свернуть свои собственные по сравнению с запуском одного из существующих пакетов?

  • Одна проблема при написании NTP-клиента заключается в правильном определении времени.

  • Другая проблема - не испортить оставшуюся часть сети или поставитьнеоправданная нагрузка на серверы.

В любом случае, как обсуждалось в потоке, на который я вам указывал, вы хотите использовать SNTP и должны взглянуть на эталонную реализацию SNTP в ntptarball, чтобы указать путь и помочь вам понять, что вы должны делать.

...