首先,您传递给名称服务器的名称不是点分隔的,而是名称的每个部分都是单独传输的。
其次,您不发送转换为十六进制的数据,而是直接发送它们。十六进制 ( \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";