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

通讯编程

开发平台:

Visual C++

  1. #!/usr/bin/perl
  2. use strict subs, vars;
  3. use FileHandle;
  4. use English;
  5. my @NODES;
  6. sub ReadAddrMap {
  7.     my ($fname) = @ARG;
  8.     open(F,$fname) or die "Can't open address map file '$fname'";
  9.     while (<F>) {
  10. if (/[^#]*(d+)s+([w.]+)s+([0-9a-fA-F.:]+)/) {
  11.     $NODES[$1]->{ip} = $2;
  12.     $NODES[$1]->{mac} = $3;
  13.     }
  14.     close F;
  15. }
  16. sub DumpFilter {
  17.     my ($time, $rfilterout, $roldfilter) = @ARG;
  18.     my $i;
  19.     my $cnt = 0;
  20.     my $change_cnt = 0;
  21.     for ($i = 0; $i <= $#$rfilterout; $i++) {
  22. if ($rfilterout->[$i] != $roldfilter->[$i]) { $change_cnt++; }
  23. if ($rfilterout->[$i]) { $cnt++; }
  24. $roldfilter->[$i] = $rfilterout->[$i];
  25.     }
  26.     if (0 == $change_cnt) { return; }
  27.     printf("FILTER $cntn");
  28.     for ($i = 0; $i <= $#$rfilterout; $i++) {
  29. if ($rfilterout->[$i]) { 
  30.     if ($NODES[$i]->{mac} eq "") { die "No mac addr for node $in" }
  31.     printf("$NODES[$i]->{mac}n");
  32. }
  33.     }
  34.     printf("AT %dnn",int ($time * 1000));
  35. }
  36. #/$ns_ at (d+.d+) "$god_ set-dist $node (d+) (d+)/
  37. sub ProduceFilters {
  38.     my ($SCEN, $node) = @ARG;
  39.     my @filterout;
  40.     my @oldfilterout;
  41.     my $time = 0.0;
  42.     my $max_time = 100000.0;
  43.     while (<$SCEN>) {
  44. if (/^$god_ set-dist $node (d+) (d+)/ 
  45.     || /^$god_ set-dist (d+) $node (d+)/) {
  46.     if ($2 != 1) {
  47. $filterout[$1] = 1;
  48.     }
  49. } elsif (/max time: (d+.d+),/ ) {
  50.     $max_time = $1;
  51. } elsif (/at (d+.d+) .*god_ set-dist $node (d+) (d+)/
  52.  || /$ns_ at (d+.d+) "$god_ set-dist (d+) $node (d+)/) {
  53.     if ($1 < $time) {
  54. die "set-dists for node $node aren't in chron ordern";
  55.     } elsif ($1 != $time) {
  56. DumpFilter($time,@filterout,@oldfilterout);
  57. $time = $1;
  58.     }
  59.     if ($3 == 1) {
  60. $filterout[$2] = 0;
  61.     } else {
  62. $filterout[$2] = 1;
  63.     }
  64. }
  65.     }
  66.     # spit out the last filter
  67.     DumpFilter($time,@filterout,@oldfilterout);
  68.     # remove all the filters when the trace ends
  69.     printf("FILTER 0nAT %dn",int ($max_time * 1000));
  70. }
  71. if ($#ARGV != 2) {
  72.     print "usage: gentracefile <scenario> <addr map> <node number>n";
  73.     exit -1;
  74. }
  75. my $SCEN = new FileHandle;
  76. open $SCEN,$ARGV[0] or die "Can't open scenario file $ARGV[0]";
  77. ReadAddrMap($ARGV[1]);
  78. my $node = $ARGV[2];
  79. ProduceFilters($SCEN,$node);