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

代理服务器

开发平台:

Unix_Linux

  1. #!/usr/local/bin/perl
  2. # udp-banger.pl 
  3. #
  4. # Duane Wessels, Dec 1995
  5. #
  6. # Usage: udp-banger.pl [host [port]] < url-list
  7. #
  8. # Sends a continuous stream of ICP queries to a cache.  Stdin is a list of
  9. # URLs to request.  Run N of these at the same time to simulate a heavy
  10. # neighbor cache load.
  11. use Fcntl;
  12. use Getopt::Std;
  13. use IO::Socket;
  14. $|=1;
  15. getopts('qlnr');
  16. $host=(shift || 'localhost') ;
  17. $port=(shift || '3130') ;
  18. # just copy this from src/proto.c
  19. @CODES=(
  20.     "ICP_INVALID",
  21.     "ICP_QUERY",
  22.     "UDP_HIT",
  23.     "UDP_MISS",
  24.     "ICP_ERR",
  25.     "ICP_SEND",
  26.     "ICP_SENDA",
  27.     "ICP_DATABEG",
  28.     "ICP_DATA",
  29.     "ICP_DATAEND",
  30.     "ICP_SECHO",
  31.     "ICP_DECHO",
  32.     "ICP_OP_UNUSED0",
  33.     "ICP_OP_UNUSED1",
  34.     "ICP_OP_UNUSED2",
  35.     "ICP_OP_UNUSED3",
  36.     "ICP_OP_UNUSED4",
  37.     "ICP_OP_UNUSED5",
  38.     "ICP_OP_UNUSED6",
  39.     "ICP_OP_UNUSED7",
  40.     "ICP_OP_UNUSED8",
  41.     "UDP_RELOADING",
  42.     "UDP_DENIED",
  43.     "UDP_HIT_OBJ",
  44.     "ICP_END"
  45. );
  46. $sock = IO::Socket::INET->new(PeerAddr => "$host:$port", Proto => 'udp');
  47. die "socket: $!n" unless defined($sock);
  48. chop($me=`uname -a|cut -f2 -d' '`);
  49. $myip=(gethostbyname($me))[4];
  50. $flags = fcntl ($sock, &F_GETFL, 0);
  51. $flags |= &O_NONBLOCK;
  52. die "fcntl O_NONBLOCK: $!n" unless
  53. fcntl ($sock, &F_SETFL, $flags);
  54. $flags = 0;
  55. $flags |= 0x80000000;
  56. $flags |= 0x40000000 if ($opt_n);
  57. $flags = ~0;
  58. $rn = 0;
  59. $start = time;
  60. while (<>) {
  61. chop;
  62. if ($opt_l) { # it's a Squid log file
  63. @stuff = split(/s+/, $_);
  64. $_ = $stuff[6];
  65. }
  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. die "send: $!n" unless
  78. send($sock, $request, 0);
  79. $nsent++;
  80.         $rin = '';
  81.         vec($rin,fileno($sock),1) = 1;
  82.         ($nfound,$timeleft) = select($rout=$rin, undef, undef, 2.0);
  83. next if ($nfound == 0);
  84. while (1) {
  85.          last unless ($theiraddr = recv($sock, $reply, 1024, 0));
  86.          next if $opt_q; # quietly carry on
  87. $nrecv++;
  88. if ($opt_r) {
  89. # only print send/receive rates
  90. if (($nsent & 0xFF) == 0) {
  91.      $dt = time - $start;
  92.      printf "SENT %d %f/sec; RECV %d %f/secn",
  93. $nsent,
  94. $nsent / $dt,
  95. $nrecv,
  96. $nrecv / $dt;
  97. }
  98. } else {
  99. # print the whole reply
  100.    ($junk, $junk, $sourceaddr, $junk) = unpack($sockaddr, $theiraddr);
  101.    @theirip = unpack('C4', $sourceaddr);
  102.          ($type,$ver,$len,$flag,$p1,$p2,$payload) = unpack('CCnx4Nnnx4A', $reply);
  103.          print join('.', @theirip) . ' ' . $CODES[$type] . " $_";
  104. print " hop=$p1" if ($opt_n);
  105. print " rtt=$p2" if ($opt_n);
  106. print "n";
  107. }
  108.         }
  109. }