Я должен сделать запрос к серверу имен. 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";
это должен быть пакет, который я отправляю на сервер имен, но пакет неправильный. Каков правильный способ создания пакета $
Во-первых, имя, которое вы передаете на сервер имен, не разделяется точкой, но каждая часть имени передается отдельно.
Во-вторых, вы не отправляете данные, преобразованные в hex, но отправляйте их напрямую. Шестигранник ( \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";