trsplit
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:3k
源码类别:

通讯编程

开发平台:

Visual C++

  1. eval 'exec perl -S $0 ${1+"$@"}'  # -*-Mode:Perl; perl-indent-level:8-*-
  2.     if 0;
  3. #require 5.003;
  4. #
  5. # Contributed by Giao Nguyen, http://daedalus.cs.berkeley.edu/~gnguyen
  6. #
  7. sub Usage
  8. {
  9. $0 =~ s/.*/([^/]+)$/$1/;
  10. print <<EOF;
  11. Split ns trace file into files for individual connection
  12. Usage:  $0 [options] files
  13. options: -c comment:  comment to print at the end along with total throughput
  14.  -f :  force new file for each connection
  15.  -psize size of packet in bytes
  16.  -tt trace type
  17.  -pt packet type (list)
  18.  -fid   flow id  (list)
  19.  -ctt trace type column
  20.  -cpt packet type column
  21.  -ctime time column
  22.  -csrc source address column
  23.  -cdst destination address column
  24. EOF
  25. exit;
  26. }
  27. sub Getopt
  28. {
  29. local($spec) = @_;
  30. local($key);
  31. &Usage if ($#ARGV < 0);
  32. while ($_ = $ARGV[0], /^-(w+)/) {
  33. shift @ARGV;
  34. $key = $1;
  35. $opt{$key} = (index($spec, "$key:") >= 0) ? shift @ARGV : 1;
  36. $_ = "$$key";
  37. if ($key =~ /^(tt|pt|fid)$/) {
  38. # concat to get list of values for a field in the trace
  39. eval "$_ = $_ . '$opt{$key} '";
  40. } else {
  41. eval "$_ = $opt{$key}";
  42. }
  43. }
  44. }
  45. # default information on the trace
  46. $psize = 1000; # packet size in bytes
  47. # Column numbers for each field in the trace
  48. $ctt = 1;
  49. $ctime = 2;
  50. $cpt = 5;
  51. $cfid = 8;
  52. $csrc = 9;
  53. $cdst = 10;
  54. $cseq = 11;
  55. # the file descriptor number to started with
  56. $fdcount = 4;
  57. # Set a couple of defaults if not given at the command line
  58. &Getopt(":c:psize:tt:ctt:ctime:cpt:cfid:csrc:cdst:cseq:");
  59. $force = $opt{'f'};
  60. $tt = '-' if (! $tt);
  61. $pt = 'tcp' if (! $pt);
  62. $fid = 0 if (! $fid);
  63. shift @ARGV while ($#ARGV >= 0 && (! -r $ARGV[0]));
  64. # process the trace file
  65. while (<>)
  66. {
  67. chop;
  68. @col = ('', split);
  69. $count{$col[$ctt]}++;
  70. next if (index($tt, $col[1]) < 0);
  71. next if (index($pt, $col[$cpt]) < 0);
  72. next if (index($fid, $col[$cfid]) < 0);
  73. $src = $col[$csrc];
  74. $dst = $col[$cdst];
  75. $key = "$col[1]_$col[$cpt]_$src_$dst";
  76. $time{$key} = $col[$ctime];
  77. $pktcnt{$key}++;
  78. $seqno{$key} = $col[$cseq];
  79. if ($force) {
  80. $fd = $opened{$key};
  81. if (! $fd) {
  82. $opened{$key} = $fd = $fdcount++;
  83. open($fd, ">${ARGV}_$key");
  84. }
  85. printf $fd "%0.6ft%dn", $col[$ctime], $col[$cseq];
  86. }
  87. }
  88. # print the per-connection information to STDOUT
  89. @keys = sort (keys %time);
  90. foreach $key (@keys) {
  91. $t = $time{$key};
  92. $s = $seqno{$key};
  93. if ($s > $pktcnt{$key}) {
  94. $s = $pktcnt{$key};
  95. }
  96. $maxtime = $t  if ($t > $maxtime);
  97. $maxpkt += $s;
  98. printf("%st%0.6ft%dt%0.6ft%0.6fn",
  99.        $key, $t, $s, $s/$t, 0.008 * $psize * $s/$t);
  100. }
  101. # print summary information to STDERR
  102. if ($maxtime > 0) {
  103. printf STDERR " %dt%0.6ft%st",
  104. $#keys+1, 0.008 * $psize * $maxpkt / $maxtime, $opt{'c'};
  105. @keys = sort (keys %count);
  106. foreach $key (@keys) {
  107. print STDERR $key, $count{$key}, " ";
  108. }
  109. print STDERR "n";
  110. }