callback_demo.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #
  2. # callback_demo.tcl
  3. # $Id: callback_demo.tcl,v 1.3 1998/09/02 20:38:42 tomh Exp $
  4. #
  5. # Copyright (c) 1997 University of Southern California.
  6. # All rights reserved.                                            
  7. #                                                                
  8. # Redistribution and use in source and binary forms are permitted
  9. # provided that the above copyright notice and this paragraph are
  10. # duplicated in all such forms and that any documentation, advertising
  11. # materials, and other materials related to such distribution and use
  12. # acknowledge that the software was developed by the University of
  13. # Southern California, Information Sciences Institute.  The name of the
  14. # University may not be used to endorse or promote products derived from
  15. # this software without specific prior written permission.
  16. # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  17. # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  18. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  19. #
  20. # Author/maintainer: John Heidemann <johnh@isi.edu>
  21. #
  22. proc usage {} {
  23. puts stderr {usage: ns callback_demo.tcl [options]
  24. This program exists to demonstrate tracing via callback procedures
  25. rather than files.
  26. Compare
  27. ns callback_demo.tcl -trace-callback none
  28. which creates the file callback_demo.tr
  29. with
  30. ns callback_demo.tcl -trace-callback print_traces
  31. and
  32. ns callback_demo.tcl -trace-callback print_dequeue_traces
  33. which invokes a callback to print traces to stdout.
  34. Look at the functions print_traces and print_dequeue_traces
  35. for examples of how to implement your
  36. own callbacks.
  37. }
  38. exit 1
  39. }
  40. Class TestFeature
  41. Application/FTP instproc fire {} {
  42. global opts
  43. $self instvar maxpkts_
  44. set maxpkts_ [expr $maxpkts_ + $opts(web-page-size)]
  45. $self produce $maxpkts_
  46. }
  47. TestFeature instproc print_traces {args} {
  48. # if you want args not as a list, call the parameter something else
  49. # see proc(n) for why.
  50. puts "print_traces: $args"
  51. }
  52. #
  53. # This function filters out everything but dequeue events.
  54. # A better way to do this might be to only attach the trace
  55. # to the deqT_ trace event, but that requires that you do
  56. # something like SimpleLink::trace-callback.
  57. #
  58. TestFeature instproc print_dequeue_traces {a} {
  59. # don't call the param a so that lindex works without
  60. # another level of indirection.
  61. set event_type [lindex $a 0]
  62. if {$event_type == "-"} {
  63. puts "print_dequeue_traces $a"
  64. } else {
  65. # ignore the trace
  66. }
  67. }
  68. TestFeature instproc init {} {
  69. global opts
  70. # network
  71. $self instvar ns_ node1_ node2_ link12_
  72. set ns_ [new Simulator]
  73. set node1_ [$ns_ node]
  74. set node2_ [$ns_ node]
  75. $ns_ duplex-link $node1_ $node2_ 8Mb 100ms DropTail
  76. # this is gross!
  77.   set link12_ [$ns_ link $node1_ $node2_]
  78. # traffic
  79. $self instvar tcp_ ftp_
  80. set tcp_ [$ns_ create-connection TCP/Reno $node1_ TCPSink/DelAck $node2_ 0]
  81. set ftp_ [$tcp_ attach-app FTP]
  82. $ftp_ set maxpkts_ 0
  83. $ns_ at 0 "$ftp_ fire"
  84. # traces
  85. if {$opts(trace-callback) != "none"} {
  86. $link12_ trace-callback $ns_ "$self $opts(trace-callback)"
  87. } else {
  88. $self instvar trace_file_
  89. set trace_file_ [open $opts(output) w]
  90. $link12_ trace $ns_ $trace_file_
  91. }
  92. # run things
  93. $ns_ at $opts(duration) "$self finish"
  94. $ns_ run
  95. }
  96. TestFeature instproc finish {} {
  97. $self instvar trace_file_
  98. if [info exists trace_file_] {
  99. close $trace_file_
  100. }
  101. exit 0
  102. }
  103. proc default_options {} {
  104. global opts opt_wants_arg
  105. set raw_opt_info {
  106. duration 10
  107. output callback_demo.tr
  108. # packet size is 1000B
  109. # web page size in 10 pkts
  110. web-page-size 10
  111. # boolean:
  112. trace-callback none
  113. }
  114. while {$raw_opt_info != ""} {
  115. if {![regexp "^[^n]*n" $raw_opt_info line]} {
  116. break
  117. }
  118. regsub "^[^n]*n" $raw_opt_info {} raw_opt_info
  119. set line [string trim $line]
  120. if {[regexp "^[ t]*#" $line]} {
  121. continue
  122. }
  123. if {$line == ""} {
  124. continue
  125. } elseif [regexp {^([^ ]+)[ ]+([^ ]+)$} $line dummy key value] {
  126. set opts($key) $value
  127. set opt_wants_arg($key) 1
  128. } else {
  129. set opt_wants_arg($key) 0
  130. # die "unknown stuff in raw_opt_infon"
  131. }
  132. }
  133. }
  134. proc process_args {} {
  135. global argc argv opts opt_wants_arg
  136. default_options
  137. for {set i 0} {$i < $argc} {incr i} {
  138. set key [lindex $argv $i]
  139. if {$key == "-?" || $key == "--help" || $key == "-help" || $key == "-h"} {
  140. usage
  141. }
  142. regsub {^-} $key {} key
  143. if {![info exists opt_wants_arg($key)]} {
  144. puts stderr "unknown option $key";
  145. usage
  146. }
  147. if {$opt_wants_arg($key)} {
  148. incr i
  149. set opts($key) [lindex $argv $i]
  150. } else {
  151. set opts($key) [expr !opts($key)]
  152. }
  153. }
  154. }
  155. proc main {} {
  156. process_args
  157. new TestFeature
  158. }
  159. main