0

ネームサーバーにリクエストを送信する必要があります。ソケット部分は魅力的に機能していますが、パッケージを作成するにはいくつか問題があります。

$domainname = "google.nl";

$hexdomain = ascii2he($domainname);

$package = "\x01\x01\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x0b".$hexodmain."\x00\x00\xff\x00\x01";

これはネームサーバーに送信するパッケージのはずですが、パッケージが正しくありません。$package を作成する正しい方法は何ですか

4

1 に答える 1

1

まず、ネームサーバーに渡す名前はドットで区切られていませんが、名前のすべての部分が別々に送信されます。

次に、16進数に変換されたデータを送信するのではなく、直接送信します。16進数(\x01\x01)は単なる表現です。

したがって、名前の各部分の前にはその長さがあり、最後の部分の後には空の文字列を意味するためgoogle.nl、の形式でエンコードします。これは、名前チェーンの終わりを示します。"\x06google\x02nl\x00"\x00

したがって、可変性を維持するには、ドメイン名をそのコンポーネントに分割し、各コンポーネントの前に対応する長さのバイトを付ける必要があります。

何かのようなもの

function domain2dns($domain)
{
    $split = explode(".", $domain);
    $target = ""; // cumulate here
    foreach ($split as $part) {
        // For every $part, prepend one byte denoting its length.
        // strlen($part) is its length which is supposed to be put into one character.
        $target .= chr(strlen($part)).$part;
    }
    return $target . "\x00";
}

するのに役立つかもしれません

$domainname = "google.nl";

$dnsdomain = domain2dns($domainname);

$package = "\x01\x01\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00" . $dnsdomain . "\x00\xff\x00\x01";
于 2012-11-28T14:09:53.487 に答える