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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1997 Regents of the University of California.
  3. # All rights reserved.
  4. # Redistribution and use in source and binary forms, with or without
  5. # modification, are permitted provided that the following conditions
  6. # are met:
  7. # 1. Redistributions of source code must retain the above copyright
  8. #    notice, this list of conditions and the following disclaimer.
  9. # 2. Redistributions in binary form must reproduce the above copyright
  10. #    notice, this list of conditions and the following disclaimer in the
  11. #    documentation and/or other materials provided with the distribution.
  12. # 3. All advertising materials mentioning features or use of this software
  13. #    must display the following acknowledgement:
  14. #  This product includes software developed by the MASH Research
  15. #  Group at the University of California Berkeley.
  16. # 4. Neither the name of the University nor of the Research Group may be
  17. #    used to endorse or promote products derived from this software without
  18. #    specific prior written permission.
  19. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  20. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  23. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  24. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  25. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  26. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  27. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  28. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  29. # SUCH DAMAGE.
  30. #
  31. # Code contributed by Giao Nguyen, http://daedalus.cs.berkeley.edu/~gnguyen
  32. #
  33. proc rvValue {rv {op ""}} {
  34. if [catch "$rv value" val] {
  35. set val $rv
  36. }
  37. if {$op == ""} {
  38. return $val
  39. } else {
  40. return  [expr ${op}($val)]
  41. }
  42. }
  43. Class Http
  44. Http set srcType_ TCP/Reno
  45. Http set snkType_ TCPSink
  46. Http set phttp_ 0
  47. Http set maxConn_ 4
  48. # The following rv* parameters can take a value or a RandomVariable object
  49. Http set rvClientTime_ 3.0
  50. Http set rvServerTime_ 0
  51. Http set rvReqLen_ 256
  52. Http set rvRepLen_ 4000
  53. Http set rvImgLen_ 8000
  54. Http set rvNumImg_ 4
  55. Http instproc srcType {val} { $self set srcType_ $val }
  56. Http instproc snkType {val} { $self set snkType_ $val }
  57. Http instproc phttp {val} { $self set phttp_ $val }
  58. Http instproc maxConn {val} { $self set maxConn_ $val }
  59. Http instproc rvClientTime {val} { $self set rvClientTime_ $val }
  60. Http instproc rvServerTime {val} { $self set rvServerTime_ $val }
  61. Http instproc rvReqLen {val} { $self set rvReqLen_ $val }
  62. Http instproc rvRepLen {val} { $self set rvRepLen_ $val }
  63. Http instproc rvImgLen {val} { $self set rvImgLen_ $val }
  64. Http instproc rvNumImg {val} { $self set rvNumImg_ $val }
  65. Http proc setCDF {rvName value} {
  66. if [file exists $value] {
  67. set rv [new RandomVariable/Empirical]
  68. $rv loadCDF $value
  69. set value $rv
  70. }
  71. eval "$self set ${rvName}_ $value"
  72. return $value
  73. }
  74. Http instproc init {ns client server args} {
  75. eval $self init-vars $args
  76. $self instvar srcType_ snkType_ agents_ sinks_
  77. $self instvar phttp_ maxConn_ rvClientTime_ rvServerTime_
  78. $self instvar rvReqLen_ rvRepLen_ rvNumImg_ rvImgLen_
  79. $self instvar ns_ numImg_ numGet_ numPut_ client_ server_ tStart_
  80. set ns_ $ns
  81. set client_(node) $client
  82. set server_(node) $server
  83. if {$phttp_} {
  84. set $maxConn_ 1
  85. }
  86. for {set i 0} {$i < $maxConn_} {incr i} {
  87. set csrc [new Agent/$srcType_]
  88. set ssrc [new Agent/$srcType_]
  89. lappend agents_(source) $csrc $ssrc
  90. $csrc proc done {} "$self doneRequest $i"
  91. $ssrc proc done {} "$self doneReply $i"
  92. if [string match "*FullTcp*" $srcType_] {
  93. set csnk $ssrc
  94. set ssnk $csrc
  95. $csrc set dst_ [$csnk set addr_]
  96. $csnk listen
  97. } else {
  98. set csnk [new Agent/$snkType_]
  99. set ssnk [new Agent/$snkType_]
  100. lappend agents_(sink) $csnk $ssnk
  101. }
  102. set client_($i) [$self newXfer FTP $client $server $csrc $csnk]
  103. set server_($i) [$self newXfer FTP $server $client $ssrc $ssnk]
  104. set sinks_($client_($i)) $csnk
  105. set sinks_($server_($i)) $ssnk
  106. }
  107. }
  108. Http instproc newXfer {type src dst sa da} {
  109. $self instvar ns_
  110. $ns_ attach-agent $src $sa
  111. $ns_ attach-agent $dst $da
  112. $ns_ connect $sa $da
  113. return [$sa attach-source $type]
  114. }
  115. # Http::agents return the agents of type "source" or "sink"
  116. Http instproc agents {{type source}} {
  117. $self instvar agents_
  118. return $agents_($type)
  119. }
  120. Http instproc transmit {source nbyte {npkt 0}} {
  121. $self instvar numPut_ phttp_ sinks_ ns_ sessionLen_
  122. [$source set agent_] instvar packetSize_
  123. # puts "$source transmit $nbyte $npkt [$ns_ now]"
  124. if {$nbyte <= 0} {
  125. set nbyte 1000
  126. }
  127. if {$npkt == 1} {
  128. set packetSize_ $nbyte
  129. } else {
  130. set npkt [expr int(ceil(1.0 * $nbyte / $packetSize_))]
  131. }
  132. if {$phttp_ == 0} {
  133. [$source set agent_] reset
  134. $sinks_($source) reset
  135. }
  136. incr sessionLen_ $npkt
  137. $source producemore $npkt
  138. }
  139. Http instproc start {} {
  140. $self instvar phttp_ maxConn_ rvClientTime_ rvServerTime_
  141. $self instvar rvReqLen_ rvRepLen_ rvNumImg_ rvImgLen_
  142. $self instvar ns_ numImg_ numGet_ numPut_ sessionLen_ 
  143. client_ server_ tStart_
  144. set tStart_ [$ns_ now]
  145. set numGet_ 0
  146. set numPut_ 0
  147. set sessionLen_ 0
  148. set len [rvValue $rvReqLen_ round]
  149. $self transmit $client_(0) $len 1
  150. # puts "Http $self starts at $tStart_"
  151. # puts "$self reqH$numGet_ [$client_(0) set agent_] $len"
  152. }
  153. Http instproc doneRequest {id} {
  154. $self instvar phttp_ maxConn_ rvClientTime_ rvServerTime_
  155. $self instvar rvReqLen_ rvRepLen_ rvNumImg_ rvImgLen_
  156. $self instvar ns_ numImg_ numGet_ numPut_ client_ server_ tStart_ psz_
  157. if {$numPut_ == 0} {
  158. set len [rvValue $rvRepLen_ round]
  159. } else {
  160. set num [expr $phttp_ ? $numImg_ : 1]
  161. for {set i [set len 0]} {$i < $num} {incr i} {
  162. incr len [rvValue $rvImgLen_ round]
  163. }
  164. }
  165. # puts "$self reply [$server_($id) set agent_] $len [$ns_ now]"
  166. set cmd "$self transmit $server_($id) $len"
  167. set tServer [rvValue $rvServerTime_]
  168. if {$tServer > 0} {
  169. $ns_ at [expr $tServer+[$ns_ now]] $cmd
  170. } else {
  171. eval $cmd
  172. }
  173. }
  174. Http instproc doneReply {id} {
  175. $self instvar phttp_ maxConn_ rvClientTime_ rvServerTime_
  176. $self instvar rvReqLen_ rvRepLen_ rvNumImg_ rvImgLen_
  177. $self instvar ns_ numImg_ numGet_ numPut_ client_ server_ tStart_
  178. set idlist $id
  179. if {$numPut_ == 0} {
  180. set numImg_ [rvValue $rvNumImg_ round]
  181. for {set i 1} {$i < $maxConn_} {incr i} {
  182. lappend idlist $i
  183. }
  184. }
  185. if {[incr numPut_] > $numImg_} {
  186. $self donePage
  187. return
  188. }
  189. # set numGet_ and numPut_ as if only 1 more request is needed
  190. foreach id $idlist {
  191. if {[incr numGet_] > $numImg_} break
  192. if {$phttp_} {
  193. set numGet_ $numImg_
  194. set numPut_ $numImg_
  195. }
  196. set len [rvValue $rvReqLen_ round]
  197. $self transmit $client_($id) $len 1
  198. # puts "$self reqI$numGet_ $id [$client_($id) set agent_] $len [$ns_ now]"
  199. }
  200. }
  201. Http instproc donePage {} {
  202. $self instvar phttp_ maxConn_ rvClientTime_ rvServerTime_
  203. $self instvar ns_ numImg_ numGet_ numPut_ sessionLen_ 
  204. client_ server_ tStart_
  205. set now [$ns_ now]
  206. set ct [rvValue $rvClientTime_]
  207. set out [format "%.3f %.0f %d %.3f" [expr $now - $tStart_] [expr $numImg_+1] $sessionLen_ $ct]
  208. set curtime [format "%.3f" $now]
  209. # print "curtime transaction_time num_connections sessionlen thinktime"
  210. puts "$curtime Http $self donePage $out"
  211. $ns_ at [expr $now + $ct] "$self start"
  212. }