создать шестнадцатеричный заголовок сервера имен

Я должен сделать запрос к серверу имен. 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";