返されたパケットを受信して解析できるように、(たとえば) ポート 123 経由で NTP サーバーに送信するネットワーク パケットを生成したいと考えています。目標は、ネットワーク化されたシステムによってパケットがどのように生成され、読み取られ、応答されるかをよりよく理解することです。
(1) 構造体を使用してパケットを生成する必要がありますか?
(2) 構造体内のさまざまなフィールドに適切に入力する方法がわかりません。たとえば、送信元と送信先の IP アドレスを 16 進値で設定する必要がありますか。それとももっと人間に優しい方法はありますか?
(3) 次に、フィールドに値が入力されたら、send()/write() 経由で UDP 接続を介して NTP サーバーに構造体を送信できますか? (または TCP、プロトコルが要求する場合)
私のアプローチは合理的ですか?NTP RFC を読んでいますが、クライアントがサーバーに何を送信する必要があるかまだわかりません (IP アドレスなど。これはネットワーク層ヘッダーによって処理されるべきではありませんか?) 私はこの NTP をモデル化しましたRFC 5905 の付録 A の「送信」の例の後の構造体。よろしくお願いします。以下のコード例は、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;
}