2011-06-24 13 views
6

返されたパケットを受信して​​解析できるように、ネットワークパケットを生成して(たとえば)ポート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; 
} 
+2

あなたの 'Ntp'構造体が予測不可能な方法で埋め込まれていませんか? –

+1

"ソースと宛先のIPアドレスを16進数で設定する必要があります。" - 確かにそうではありませんが、IPv6を使用する場合は優先されます。 Cには小数のリテラル、小数点以下の解析関数、およびIP解析関数(プラットフォームに依存し、OSマニュアルを確認してください)があります。 –

+1

ワイヤを介して送信するマルチバイト数のエンディアンを調整する必要があるかもしれません。これは、構造体全体を1回の書き込みで送るのを避ける別の理由です。 –

答えて

2

ネットワークプロトコルの作成経験はあまりありません。構造体を宣言して書き出すことは、方法ではありません。私はまた、http://fixunix.com/ntp/257876-any-samples-ntp-sntp-client-code.htmlにあなたを指し、具体的に以下の点を呼び出す:

  • なぜあなたはロールするんあなた自身の既存のパッケージのいずれかを実行するために比較すると?

  • NTPクライアントを書く際の1つの問題は、時間がかかることです。

  • もう1つは、残りのネットワークを台無しにしたり、サーバーに不当な負荷をかけることではありません。いずれの場合においても

私があなたを指摘したスレッドで説明したように、あなたは、SNTPを使用したいと道を指し示す、あなたは何を把握助けるためにNTPのtarballでSNTPのリファレンス実装を見てみる必要がありますあなたはすべきです。

+0

返信いただきありがとうございます。私の目標は、ネットワーク上のシステム(最も基本的なレベル)でパケットがどのように送信され、読み取られ、応答されるかをよりよく理解することです。私は公に利用できるクライアントを作るつもりはありません - プロトコルに準拠したパケットを正常に送信したいだけです。この場合、NTP;もっと現実的な目標になると思っていたので、私はそれを選びました。私は私の質問が正確に私の目標を宣伝していないと思うし、私は混乱のためにお詫び申し上げます。あなたの建設的な対応に感謝します。私はそれに応じて私の質問を編集します。 – shelladept

関連する問題