我必须向名称服务器发出请求。 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的正确方法
答案 0 :(得分:1)
首先,传递给名称服务器的名称不是以点分隔的,但名称的每个部分都是单独传输的。
其次,您不会将转换为十六进制的数据发送,而是直接发送。十六进制(\x01\x01
)只是表示。
所以你会以google.nl
的形式对"\x06google\x02nl\x00"
进行编码,因为每个名称部分都以其长度开头,最后一个以\x00
为后面,意味着空string - 反过来表示名称链的结尾。
因此,为了保持变量,您应该将域名拆分为其组件,并在每个组件前面加上相应的长度字节。
像
这样的东西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";