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

通讯编程

开发平台:

Visual C++

  1. #!/bin/sh
  2. # the next line finds ns 
  3. nshome=`dirname $0`; [ ! -x $nshome/ns ] && [ -x ../../ns ] && nshome=../..
  4. # the next line starts ns 
  5. export nshome; exec $nshome/ns "$0" "$@"
  6. if [info exists env(nshome)] {
  7. set nshome $env(nshome)
  8. } elseif [file executable ../../ns] {
  9. set nshome ../..
  10. } elseif {[file executable ./ns] || [file executable ./ns.exe]} {
  11. set nshome "[pwd]"
  12. } else {
  13. puts "$argv0 cannot find ns directory"
  14. exit 1
  15. }
  16. set env(PATH) "$nshome/bin:$env(PATH)"
  17. #source $nshome/tcl/lan/ns-lan.tcl
  18. source $nshome/tcl/http/http.tcl
  19. set opt(trsplit) "-"
  20. set opt(tr) out
  21. set opt(namtr) ""
  22. set opt(stop) 20
  23. set opt(node) 3
  24. set opt(seed) 0
  25. set opt(bw) 1.8Mb
  26. set opt(delay) 1ms
  27. set opt(ll) LL
  28. set opt(ifq) Queue/DropTail
  29. set opt(mac) Mac/Csma/Cd
  30. set opt(chan) Channel
  31. set opt(tcp) TCP/Reno
  32. set opt(sink) TCPSink
  33. # number of traffic source (-1 means the number of nodes $opt(node))
  34. set opt(telnet) 0
  35. set opt(cbr) 0
  36. set opt(ftp) 0
  37. set opt(http) -1
  38. set opt(webModel) $nshome/tcl/http/data
  39. set opt(maxConn) 4
  40. set opt(phttp) 0
  41. if {$argc == 0} {
  42. puts "Usage: $argv0 [-stop sec] [-seed value] [-node numNodes]"
  43. puts "t[-tr tracefile] [-g]"
  44. puts "t[-ll lltype] [-ifq qtype] [-mac mactype]"
  45. puts "t[-bw $opt(bw)] [-delay $opt(delay)]"
  46. exit 1
  47. }
  48. proc getopt {argc argv} {
  49. global opt
  50. for {set i 0} {$i < $argc} {incr i} {
  51. set key [lindex $argv $i]
  52. if ![string match {-*} $key] continue
  53. set key [string range $key 1 end]
  54. set val [lindex $argv [incr i]]
  55. set opt($key) $val
  56. if [string match {-[A-z]*} $val] {
  57. incr i -1
  58. continue
  59. }
  60. switch $key {
  61. ll  { set opt($key) LL/$val }
  62. ifq { set opt($key) Queue/$val }
  63. mac { set opt($key) Mac/$val }
  64. }
  65. }
  66. }
  67. proc finish {} {
  68. global env nshome pwd
  69. global ns opt trfd
  70. $ns flush-trace
  71. close $trfd
  72. foreach key {node bw delay ll ifq mac seed} {
  73. lappend comment $opt($key)
  74. }
  75. exec perl $nshome/bin/trsplit -tt r -pt tcp -c "$comment" 
  76. $opt(trsplit) $opt(tr) >& $opt(tr)-bw
  77. exec head -1 $opt(tr)-bw >@ stdout
  78. if [info exists opt(g)] {
  79. catch "exec xgraph -nl -M -display $env(DISPLAY) 
  80. [lsort [glob $opt(tr).*]] &"
  81. }
  82. exit 0
  83. }
  84. proc create-trace {} {
  85. global ns opt
  86. if {[info exists opt(f)] || [info exists opt(g)]} {
  87. set opt(trsplit) "-f"
  88. }
  89. if [file exists $opt(tr)] {
  90. exec touch $opt(tr).
  91. eval exec rm -f $opt(tr) $opt(tr)-bw [glob $opt(tr).*]
  92. }
  93. set trfd [open $opt(tr) w]
  94. $ns trace-all $trfd
  95. if {$opt(namtr) != ""} {
  96. $ns namtrace-all [open $opt(namtr) w]
  97. }
  98. return $trfd
  99. }
  100. proc create-topology {} {
  101. global ns opt
  102. global lan node source
  103. # Nodes:
  104. #  0 a router from LAN to external network
  105. #  1 to n nodes on the LAN
  106. #  n+1 node outside of the LAN,
  107. set num $opt(node)
  108. set node(0)  [$ns node]
  109. for {set i 1} {$i <= $num} {incr i} {
  110. set node($i) [$ns node]
  111. lappend nodelist $node($i)
  112. }
  113. set node($i) [$ns node]
  114. $ns duplex-link $node(0) $node($i) 10Mb 50ms DropTail
  115. set lan [$ns newLan $nodelist $opt(bw) $opt(delay) -llType $opt(ll) 
  116. -ifqType $opt(ifq) -macType $opt(mac)]
  117. $lan addNode $node(0) $opt(bw) $opt(delay)
  118. set ifq0 [[$lan netIface $node(0)] set ifq_]
  119. $ifq0 set limit_ [expr $opt(node) * [$ifq0 set limit_]]
  120. }
  121. proc create-source {} {
  122. global ns opt
  123. global lan node source
  124. if {$opt(webModel) != ""} {
  125. create-webModel $opt(webModel)
  126. }
  127. # make node($num+1) the source of all connection
  128. set src $node(0)
  129. foreach ttype {http ftp cbr telnet} {
  130. set num $opt($ttype)
  131. if {$num < 0} {
  132. set num $opt(node)
  133. }
  134. for {set i 0} {$i < $num} {incr i} {
  135. set dst $node([expr 1 + $i % $opt(node)])
  136. new_$ttype $i $src $dst
  137. }
  138. }
  139. }
  140. proc create-webModel path {
  141. Http setCDF rvClientTime 0
  142. # Http setCDF rvClientTime $path/HttpThinkTime.cdf
  143. Http setCDF rvReqLen $path/HttpRequestLength.cdf
  144. Http setCDF rvNumImg $path/HttpConnections.cdf
  145. set rv [Http setCDF rvRepLen $path/HttpReplyLength.cdf]
  146. Http setCDF rvImgLen $rv
  147. }
  148. proc new_http {i server client} {
  149. global ns opt http webm
  150. set webopt "-srcType $opt(tcp) -snkType $opt(sink) -phttp $opt(phttp) -maxConn $opt(maxConn)"
  151. set http($i) [eval new Http $ns $client $server $webopt]
  152. $ns at [expr 0 + $i/1000.0] "$http($i) start"
  153. }
  154. proc new_cbr {i src dst} {
  155. global ns opt cbr
  156. set cbr($i) [$ns create-connection CBR $src Null $dst 0]
  157. $ns at [expr 0.0001 + $i/1000.0] "$cbr($i) start"
  158. }
  159. proc new_ftp {i src dst} {
  160. global ns opt ftp
  161. set tcp [$ns create-connection $opt(tcp) $src $opt(sink) $dst 0]
  162. set ftp($i) [$tcp attach-source FTP]
  163. $ns at [expr 0.0002 + $i/1000.0] "$ftp($i) start"
  164. }
  165. proc new_telnet {i src dst} {
  166. global ns opt telnet
  167. set tcp [$ns create-connection $opt(tcp) $src $opt(sink) $dst 0]
  168. set telnet($i) [$tcp attach-source Telnet]
  169. $ns at [expr 0.0003 + $i/1000.0] "$telnet($i) start"
  170. }
  171. ## MAIN ##
  172. getopt $argc $argv
  173. if {$opt(seed) >= 0} { ns-random $opt(seed) }
  174. if [info exists opt(qsize)] { Queue set limit_ $opt(qsize) }
  175. set ns [new Simulator]
  176. set trfd [create-trace]
  177. create-topology
  178. $lan trace $ns $trfd
  179. create-source
  180. $ns at $opt(stop) "finish"
  181. $ns run