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

通讯编程

开发平台:

Visual C++

  1. source ../../../ex/asym/util.tcl
  2. set WebCScount 0
  3. Class WebCS
  4. proc createTransfer {ns src dst tcpargs tcptrace sinkargs session sessionargs doneargs xfersz} {
  5. set tcp [eval createTcpSource $tcpargs]
  6. $tcp proc done {} " $doneargs"
  7. if {$xfersz < 1} {
  8. $tcp set packetSize_ [expr int($xfersz*1000)]
  9. }
  10. set sink [eval createTcpSink $sinkargs]
  11. set ftp [createFtp $ns $src $tcp $dst $sink]
  12. if {$session} {
  13. set newSessionFlag false
  14. set newSessionFlag [eval setupTcpSession $tcp $sessionargs]
  15. setupTcpTracing $tcp $tcptrace $newSessionFlag
  16. }
  17. setupTcpTracing $tcp $tcptrace $session
  18. return $ftp
  19. }
  20. proc numberOfImages {} {
  21. global numimg
  22. return $numimg
  23. }
  24. proc htmlRequestSize {} {
  25. global reqsize
  26. return $reqsize
  27. }
  28. proc htmlReplySize {} {
  29. global htmlsize
  30. return $htmlsize
  31. }
  32. proc imageRequestSize {} {
  33. global reqsize
  34. return $reqsize
  35. }
  36. proc imageResponseSize {} {
  37. global imgsize
  38. return $imgsize
  39. }
  40. WebCS instproc init {ns client server tcpargs tcptrace sinkargs {phttp 0} {httpseq 0} {session false} {sessionargs ""}} {
  41. $self instvar ns_ 
  42. $self instvar ftpCS1_ ftpCS2_ 
  43. $self instvar ftpSC1_ ftpSC2_
  44. $self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
  45. $self instvar numImgRecd_ numImgRepl_
  46. $self instvar numImgReq_
  47. $self instvar starttime_ endtime_
  48. $self instvar phttp_ httpseq_ session_
  49. $self instvar finish_
  50. global WebCScount
  51. incr WebCScount
  52. set ns_ $ns
  53. set phttp_ $phttp
  54. set httpseq_ $httpseq
  55. set session_ $session
  56. # compute transfer sizes
  57. set numImg_ [numberOfImages]
  58. set htmlReqsz_ [htmlRequestSize]
  59. set htmlReplsz_ [htmlReplySize]
  60. set imgReqsz_ [imageRequestSize]
  61. set imgReplsz_ [imageResponseSize]
  62. # create "ftp's" for each transfer
  63. set ftpCS1_ [createTransfer $ns $client $server "TCP/Newreno" $tcptrace $sinkargs $session $sessionargs "$self htmlReqDone" $htmlReqsz_]
  64. set ftpSC1_ [createTransfer $ns $server $client $tcpargs $tcptrace $sinkargs $session $sessionargs "$self htmlReplDone" $htmlReplsz_]
  65. # XXX assume request to be of fixed size regardless of numImg_
  66. # unless HTTP with sequential connections is being employed
  67. if {$httpseq} {
  68. set numImgReq_ $numImg_
  69. for {set i 0} {$i < $numImg_} {incr i 1} {
  70. set ftpCS2_($i) [createTransfer $ns $client $server "TCP/Newreno" $tcptrace $sinkargs $session $sessionargs "$self imgReqDone" $imgReqsz_]
  71. }
  72. } else {
  73. set numImgReq_ 1
  74. set ftpCS2_(0) $ftpCS1_
  75. }
  76. for {set i 0} {$i < $numImg_} {incr i 1} {
  77. if {$phttp} {
  78. set ftpSC2_($i) $ftpSC1_
  79. # if {$i == 0} {
  80. # set ftpSC2_($i) [createTransfer $ns $server $client $tcpargs $tcptrace $sinkargs $session $sessionargs "$self imgReplDone" $imgReplsz_]
  81. # } else {
  82. # set ftpSC2_($i) $ftpSC2_(0)
  83. # }
  84. } else {
  85. set ftpSC2_($i) [createTransfer $ns $server $client $tcpargs $tcptrace $sinkargs $session $sessionargs "$self imgReplDone" $imgReplsz_]
  86. }
  87. }
  88. }
  89. WebCS instproc start {} {
  90. $self instvar ns_ 
  91. $self instvar ftpCS1_ ftpCS2_ 
  92. $self instvar ftpSC1_ ftpSC2_
  93. $self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
  94. $self instvar numImgRecd_ numImgRepl_
  95. $self instvar numImgReq_
  96. $self instvar starttime_ endtime_
  97. $self instvar phttp_ httpseq_ session_
  98. set starttime_ [$ns_ now]
  99. set numImgRecd_ 0
  100. set numImgRepl_ 0
  101. if {$htmlReqsz_ < 1} {
  102. $ftpCS1_ producemore 1
  103. } else {
  104. $ftpCS1_ producemore $htmlReqsz_
  105. }
  106. }
  107. WebCS instproc htmlReqDone {} {
  108. $self instvar ns_ 
  109. $self instvar ftpCS1_ ftpCS2_ 
  110. $self instvar ftpSC1_ ftpSC2_
  111. $self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
  112. $self instvar numImgRecd_ numImgRepl_
  113. $self instvar numImgReq_
  114. $self instvar starttime_ endtime_
  115. $self instvar phttp_ httpseq_ session_
  116. $ftpSC1_ producemore $htmlReplsz_
  117. }
  118. WebCS instproc htmlReplDone {} {
  119. $self instvar ns_ 
  120. $self instvar ftpCS1_ ftpCS2_ 
  121. $self instvar ftpSC1_ ftpSC2_
  122. $self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
  123. $self instvar numImgRecd_ numImgRepl_
  124. $self instvar numImgReq_
  125. $self instvar starttime_ endtime_
  126. $self instvar phttp_ httpseq_ session_
  127. [$ftpCS1_ agent] proc done {} "$self imgReqDone"
  128. [$ftpSC1_ agent] proc done {} "$self imgReplDone"
  129. if {$imgReqsz_ < 1} {
  130. $ftpCS2_($numImgRecd_) producemore 1
  131. } else {
  132. $ftpCS2_($numImgRecd_) producemore $imgReqsz_
  133. }
  134. }
  135. WebCS instproc imgReqDone {} {
  136. $self instvar ns_ 
  137. $self instvar ftpCS1_ ftpCS2_ 
  138. $self instvar ftpSC1_ ftpSC2_
  139. $self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
  140. $self instvar numImgRecd_ numImgRepl_
  141. $self instvar numImgReq_
  142. $self instvar starttime_ endtime_
  143. $self instvar phttp_ httpseq_ session_
  144. if {$httpseq_} {
  145. $ftpSC2_($numImgRepl_) producemore $imgReplsz_
  146. incr numImgRepl_
  147. } else {
  148. for {} {$numImgRepl_ < $numImg_} {incr numImgRepl_ 1} {
  149. $ftpSC2_($numImgRepl_) producemore $imgReplsz_
  150. }
  151. }
  152. }
  153. WebCS instproc imgReplDone {} {
  154. $self instvar ns_ 
  155. $self instvar ftpCS1_ ftpCS2_ 
  156. $self instvar ftpSC1_ ftpSC2_
  157. $self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
  158. $self instvar numImgRecd_ numImgRepl_
  159. $self instvar numImgReq_
  160. $self instvar starttime_ endtime_
  161. $self instvar phttp_ httpseq_ session_
  162. incr numImgRecd_
  163. if {($numImgRecd_ == $numImg_) || $phttp_} {
  164. $self end
  165. } elseif {$httpseq_} {
  166. $self htmlReplDone
  167. }
  168. }
  169. WebCS instproc end {} {
  170. $self instvar ns_ 
  171. $self instvar ftpCS1_ ftpCS2_ 
  172. $self instvar ftpSC1_ ftpSC2_
  173. $self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
  174. $self instvar numImgRecd_ numImgRepl_
  175. $self instvar numImgReq_
  176. $self instvar starttime_ endtime_
  177. $self instvar phttp_ httpseq_ session_
  178. $self instvar finish_
  179. global WebCScount
  180. set endtime_ [$ns_ now]
  181. puts -nonewline stderr "[format "%.3f " [expr $endtime_ - $starttime_]]"
  182. if {$phttp_} {
  183. set nrexmit [[$ftpSC2_(0) agent] set nrexmit_]
  184. } elseif {$session_} {
  185. set nrexmit [[[$ftpSC2_(0) agent] session] set nrexmit_]
  186. } else {
  187. set nrexmit 0
  188. for {set i 0} {$i < $numImg_} {incr i} {
  189. incr nrexmit [[$ftpSC2_($i) agent] set nrexmit_]
  190. }
  191. }
  192. puts -nonewline stderr "$nrexmit "
  193. flush stderr
  194. incr WebCScount -1
  195. if {$WebCScount == 0} {
  196. eval "$finish_"
  197. }
  198. # $ns_ at [expr [$ns_ now] + 3] "$self start"
  199. # [$ftpCS1_ agent] proc done {} "$self htmlReqDone"
  200. # [$ftpSC1_ agent] proc done {} "$self htmlReplDone"
  201. }