17. 網域名稱系統

正解

#! /usr/bin/perl

use strict;
use Socket;

print <<HERE;
請輸入您想查詢的完整主機網域名稱?
FQDN ?
HERE

while (<>) {
  chomp;
  if ($_ eq 'exit') { last; }
  my $paddr = gethostbyname($_);
  unless ($paddr) {
    print "$_ => ?\n";
    next;
  }

  my $daddr = inet_ntoa($paddr);
  print "$_ => $daddr\n";
}

# 可能輸出結果:

請輸入您想查詢的完整主機網域名稱?
FQDN ?
www.tnc.edu.tw
www.tnc.edu.tw => 163.26.200.3
www.hinet.net
www.hinet.net => 168.95.1.88
tw.yahoo.com
tw.yahoo.com => 202.1.237.21
www.redhat.com
www.redhat.com => 66.187.232.50
www.microsoft.com
www.microsoft.com => 207.46.134.190

反解

#! /usr/bin/perl

use strict;
use Socket;

my $A = '^\d+\.\d+\.\d+\.\d+$';

system("/usr/bin/clear");

print "反解模擬器 v1.0\n";
print "請輸入要反解的 IP ? (^C 或 exit可離開)\n\$反解\> ";

my $i=0;
while (<>) {
  if (++$i > 5) {system("/usr/bin/clear"); $i=0;}
  chomp;
  last unless ($_ ne 'exit');
  unless (/$A/o) {print "您輸入的不是合法的IP格式!\n"; next;}
  my $name = gethostbyaddr(inet_aton($_), AF_INET);

  #$name ||= '?'; # 此式形同: $name = $name || '?';
  $name = $name || '無法查得(可能無法連接或反解未授權)';

print "$_ => $name\n";
  print "\n請輸入要反解的 IP ? (^C 或 exit可離開)\n\$反解\> ";
}

# 可能輸出結果:

反解模擬器 v1.0
請輸入要反解的 IP ? (^C 或 exit可離開)
$反解> 163.26.200.1
163.26.200.1 => dns.tnc.edu.tw

請輸入要反解的 IP ? (^C 或 exit可離開)
$反解> 168.95.1.1
168.95.1.1 => dns.hinet.net

請輸入要反解的 IP ? (^C 或 exit可離開)
$反解>