icp-test.pl
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:3k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. #!/usr/local/bin/perl
  2. # icp-test.pl 
  3. #
  4. # Duane Wessels, Nov 1996
  5. #
  6. # Usage: icp-test.pl host:port ... < url-list
  7. #
  8. # Sends a continuous stream of ICP queries to a set of caches.  Stdin is
  9. # a list of URLs to request.
  10. require 'getopts.pl';
  11. $|=1;
  12. &Getopts('n');
  13. # just copy this from src/proto.c
  14. @CODES=(
  15.     "ICP_INVALID",
  16.     "ICP_QUERY",
  17.     "UDP_HIT",
  18.     "UDP_MISS",
  19.     "ICP_ERR",
  20.     "ICP_SEND",
  21.     "ICP_SENDA",
  22.     "ICP_DATABEG",
  23.     "ICP_DATA",
  24.     "ICP_DATAEND",
  25.     "ICP_SECHO",
  26.     "ICP_DECHO",
  27.     "ICP_OP_UNUSED0",
  28.     "ICP_OP_UNUSED1",
  29.     "ICP_OP_UNUSED2",
  30.     "ICP_OP_UNUSED3",
  31.     "ICP_OP_UNUSED4",
  32.     "ICP_OP_UNUSED5",
  33.     "ICP_OP_UNUSED6",
  34.     "ICP_OP_UNUSED7",
  35.     "ICP_OP_UNUSED8",
  36.     "UDP_RELOADING",
  37.     "UDP_DENIED",
  38.     "UDP_HIT_OBJ",
  39.     "ICP_END"
  40. );
  41. require 'sys/socket.ph';
  42. $sockaddr = 'S n a4 x8';
  43. ($name, $aliases, $proto) = getprotobyname("udp");
  44. $thissock = pack($sockaddr, &AF_INET, 0, "");
  45. chop($me=`uname -a|cut -f2 -d' '`);
  46. $myip=(gethostbyname($me))[4];
  47. die "socket: $!n" unless
  48. socket (SOCK, &AF_INET, &SOCK_DGRAM, $proto);
  49. $flags = 0;
  50. $flags |= 0x80000000;
  51. $flags |= 0x40000000 if ($opt_n);
  52. $flags = ~0;
  53. while ($ARGV[0] =~ /([^:]+):(d+)/) {
  54. $host = $1;
  55. $port = $2;
  56. ($fqdn, $aliases, $type, $len, $themaddr) = gethostbyname($host);
  57. $ADDR{$host} = pack('Sna4x8', &AF_INET, $port, $themaddr);
  58. $ip = join('.', unpack('C4', $themaddr));
  59. $FQDN{$ip} = $fqdn;
  60. shift;
  61. }
  62. $rn = 0;
  63. while (<>) {
  64. print;
  65. chop;
  66. $len = length($_) + 1;
  67. $request_template = sprintf 'CCnNNa4a4x4a%d', $len;
  68. $request = pack($request_template,
  69. 1,              # C opcode
  70. 2,              # C version
  71. 24 + $len,      # n length
  72. ++$rn,          # N reqnum
  73. $flags,         # N flags
  74. '',             # a4 pad
  75. $myip,          # a4 shostid
  76. $_);            # a%d payload
  77. $n = 0;
  78. foreach $host (keys %ADDR) {
  79. $port = $PORT{$host};
  80. @ip = split('.', $IP{$host});
  81. $them = pack('SnC4x8', &AF_INET, $port, @ip);
  82. ($sport,@IP) = unpack('x2nC4x8', $ADDR{$host});
  83. die "send: $!n" unless send(SOCK, $request, 0, $ADDR{$host});
  84. $n++;
  85. }
  86. while ($n > 0) {
  87.          $rin = '';
  88.          vec($rin,fileno(SOCK),1) = 1;
  89.          ($nfound,$timeleft) = select($rout=$rin, undef, undef, 2.0);
  90. last if ($nfound == 0);
  91. die "recv: $!n" unless
  92.                  $theiraddr = recv(SOCK, $reply, 1024, 0);
  93.    ($junk, $junk, $sourceaddr, $junk) = unpack($sockaddr, $theiraddr);
  94.    $ip = join('.', unpack('C4', $sourceaddr));
  95.          ($type,$ver,$len,$flag,$p1,$p2,$payload) = unpack('CCnx4Nnnx4A', $reply);
  96.          printf "t%-20.20s %-10.10s",
  97. $FQDN{$ip},
  98. $CODES[$type];
  99. print " hop=$p1" if ($opt_n);
  100. print " rtt=$p2" if ($opt_n);
  101. print "n";
  102. $n--;
  103. }
  104. }