返されたパケットを受信して解析できるように、ネットワークパケットを生成して(たとえば)ポート123をNTPサーバーに送信する必要があります。目標は、ネットワーク化されたシステムによってパケットがどのように生成され、読み取られ、応答されるかをよりよく理解することです。C/C++でネットワークパケットを生成する方法
(1)パケットを生成するために構造体を使用すべきですか?
(2)構造体内のさまざまなフィールドを正しく埋め込む方法がわかりません。たとえば、送信元IPアドレスと宛先IPアドレスを16進数で設定する必要がありますか?それとももっと人にやさしい方法がありますか?
(3)次に、フィールドにデータが入力されたら、UDP接続を介してsend()/ write()を介して構造体をNTPサーバーに送信できますか? (または、プロトコルが要求するならば、TCP)
私のアプローチは妥当ですか?私はNTP RFCを読んできましたが、私のクライアントがサーバに送るべきものが何であるかはまだ分かりません(IPアドレスなど、これはネットワーク層のヘッダーで扱われるべきではないでしょうか?)私はこのNTPをモデル化しましたRFC 5905の付録Aの「送信」の例の後にstructを記述しています。私の質問に言葉があまりにも長すぎたり長すぎたりしたら謝ります。助けをありがとうございました。以下のコード例は、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'構造体が予測不可能な方法で埋め込まれていませんか? –
"ソースと宛先のIPアドレスを16進数で設定する必要があります。" - 確かにそうではありませんが、IPv6を使用する場合は優先されます。 Cには小数のリテラル、小数点以下の解析関数、およびIP解析関数(プラットフォームに依存し、OSマニュアルを確認してください)があります。 –
ワイヤを介して送信するマルチバイト数のエンディアンを調整する必要があるかもしれません。これは、構造体全体を1回の書き込みで送るのを避ける別の理由です。 –