0

我必须向名称服务器发出请求。socketpart 的工作就像一个魅力,但要创建包我有一些问题。

$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

首先,您传递给名称服务器的名称不是点分隔的,而是名称的每个部分都是单独传输的。

其次,您不发送转换为十六进制的数据,而是直接发送它们。十六进制 ( \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 回答