Perl для системного администрирования


Служба доменных имен (DNS) - часть 16


$ancount,

Snscount,

Sarcount) = unpack("n C2 n4",$buf);

if (!$ancount) <

warn "Невозможно получить информацию для $hostname с Sserver!\n";

return;

}

 распаковываем раздел вопроса

tt раздел вопроса начинается после 12 байтов

($position,$qname) = <Sdecompress(12);

($qtype,$qclass)=unpack('§'.Sposition.'n2',Sbuf);

tt переходим к концу вопроса

Sposition += 4;

nntt

tttttt распаковываем все записи о ресурсах

ttntt

for ( ;$ancount;$ancount--){

(Sposition,$rname) = &decompress($position);

(Srtype,Srclass,$rttl,$rdlength)=

unpack('@'.Sposition.'n2 N n',$buf);

Sposition +=10;

tt следующую строку можно изменить и использовать более

# сложную структуру данных; сейчас мы подбираем

 последнюю возвращенную запись

$results{$server}=

join('.',unpack('@'.Sposition.'C'.$rdlength,$buf));

Sposition +=$rdlength; } >

О обрабатываем информацию, "сжатую" в соответствии с RFC1035

# мы переходим в первую позицию в пакете и возвращаем

# найденное там имя (после того как разберемся с указателем

# сжатого формата) и место, которое мы оставили в конце

# найденного имени sub decompress {

my($start) = $_[0]; my($domain,$i,Slenoct);

for ($i=$start;$i<=$respsize;) {

$lenoct=unpack('@'.$i.'C', $buf); n длина метки

if (! Slenoct){ tt 0 означает, что этот раздел обработан

$i++;

last; }

if (Slenoct == 192) { tt встретили указатель,

tt следовательно, выполняем рекурсию

Sdomain.=(&decompress((unpack('@'.$i.'n',$buf) & 1023)))[1];

$i+=2;

last } else { tt в противном случае это простая метка

$domain.=unpack('@г.++$i.'a'.Slenoct,$buf).'. ';

$i += Slenoct; }

return($i,Sdomain);

}

Надо заметить, что эта программа не является точным эквивалентом предыдущего примера, потому что мы не пытаемся эмулировать все нюансы поведения nslookup (тайм-ауты, повторные попытки и списки поиска). Рассматривая все три подхода, представленные здесь, обязательно обратите внимание на такие различия.

Преимущества этого подхода заключаются в следующем:




- Начало -  - Назад -  - Вперед -



Книжный магазин