⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 http.tcl

📁 NS-2.28的802.11e协议扩展源代码
💻 TCL
字号:
## Copyright (c) 1997 Regents of the University of California.# All rights reserved.# # Redistribution and use in source and binary forms, with or without# modification, are permitted provided that the following conditions# are met:# 1. Redistributions of source code must retain the above copyright#    notice, this list of conditions and the following disclaimer.# 2. Redistributions in binary form must reproduce the above copyright#    notice, this list of conditions and the following disclaimer in the#    documentation and/or other materials provided with the distribution.# 3. All advertising materials mentioning features or use of this software#    must display the following acknowledgement:# 	This product includes software developed by the MASH Research# 	Group at the University of California Berkeley.# 4. Neither the name of the University nor of the Research Group may be#    used to endorse or promote products derived from this software without#    specific prior written permission.# # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF# SUCH DAMAGE.## Code contributed by Giao Nguyen, http://daedalus.cs.berkeley.edu/~gnguyen#proc rvValue {rv {op ""}} {	if [catch "$rv value" val] {		set val $rv	}	if {$op == ""} {		return $val	} else {		return  [expr ${op}($val)]	}}Class HttpHttp set srcType_ TCP/RenoHttp set snkType_ TCPSinkHttp set phttp_ 0Http set maxConn_ 4# The following rv* parameters can take a value or a RandomVariable objectHttp set rvClientTime_ 3.0Http set rvServerTime_ 0Http set rvReqLen_ 256Http set rvRepLen_ 4000Http set rvImgLen_ 8000Http set rvNumImg_ 4Http instproc srcType {val} { $self set srcType_ $val }Http instproc snkType {val} { $self set snkType_ $val }Http instproc phttp {val} { $self set phttp_ $val }Http instproc maxConn {val} { $self set maxConn_ $val }Http instproc rvClientTime {val} { $self set rvClientTime_ $val }Http instproc rvServerTime {val} { $self set rvServerTime_ $val }Http instproc rvReqLen {val} { $self set rvReqLen_ $val }Http instproc rvRepLen {val} { $self set rvRepLen_ $val }Http instproc rvImgLen {val} { $self set rvImgLen_ $val }Http instproc rvNumImg {val} { $self set rvNumImg_ $val }Http proc setCDF {rvName value} {	if [file exists $value] {		set rv [new RandomVariable/Empirical]		$rv loadCDF $value		set value $rv	}	eval "$self set ${rvName}_ $value"	return $value}Http instproc init {ns client server args} {	eval $self init-vars $args	$self instvar srcType_ snkType_ agents_ sinks_	$self instvar phttp_ maxConn_ rvClientTime_ rvServerTime_	$self instvar rvReqLen_ rvRepLen_ rvNumImg_ rvImgLen_	$self instvar ns_ numImg_ numGet_ numPut_ client_ server_ tStart_	set ns_ $ns	set client_(node) $client	set server_(node) $server	if {$phttp_} {		set $maxConn_ 1	}	for {set i 0} {$i < $maxConn_} {incr i} {		set csrc [new Agent/$srcType_]		set ssrc [new Agent/$srcType_]		lappend agents_(source) $csrc $ssrc		$csrc proc done {} "$self doneRequest $i"		$ssrc proc done {} "$self doneReply $i"		if [string match "*FullTcp*" $srcType_] {			set csnk $ssrc			set ssnk $csrc			$csrc set dst_ [$csnk set addr_]			$csnk listen		} else {			set csnk [new Agent/$snkType_]			set ssnk [new Agent/$snkType_]			lappend agents_(sink) $csnk $ssnk		}		set client_($i) [$self newXfer FTP $client $server $csrc $csnk]		set server_($i) [$self newXfer FTP $server $client $ssrc $ssnk]		set sinks_($client_($i)) $csnk		set sinks_($server_($i)) $ssnk	}}Http instproc newXfer {type src dst sa da} {	$self instvar ns_	$ns_ attach-agent $src $sa	$ns_ attach-agent $dst $da	$ns_ connect $sa $da	return [$sa attach-source $type]}# Http::agents return the agents of type "source" or "sink"Http instproc agents {{type source}} {	$self instvar agents_	return $agents_($type)}Http instproc transmit {source nbyte {npkt 0}} {	$self instvar numPut_ phttp_ sinks_ ns_ sessionLen_	[$source set agent_] instvar packetSize_#	puts "$source transmit $nbyte $npkt [$ns_ now]"	if {$nbyte <= 0} {		set nbyte 1000	}	if {$npkt == 1} {		set packetSize_ $nbyte	} else {		set npkt [expr int(ceil(1.0 * $nbyte / $packetSize_))]	}	if {$phttp_ == 0} {		[$source set agent_] reset		$sinks_($source) reset	}	incr sessionLen_ $npkt	$source producemore $npkt}Http instproc start {} {	$self instvar phttp_ maxConn_ rvClientTime_ rvServerTime_	$self instvar rvReqLen_ rvRepLen_ rvNumImg_ rvImgLen_	$self instvar ns_ numImg_ numGet_ numPut_ sessionLen_ \			client_ server_ tStart_	set tStart_ [$ns_ now]	set numGet_ 0	set numPut_ 0	set sessionLen_ 0	set len [rvValue $rvReqLen_ round]	$self transmit $client_(0) $len 1#	puts "Http $self starts at $tStart_"#	puts "$self reqH$numGet_ [$client_(0) set agent_] $len"}Http instproc doneRequest {id} {	$self instvar phttp_ maxConn_ rvClientTime_ rvServerTime_	$self instvar rvReqLen_ rvRepLen_ rvNumImg_ rvImgLen_	$self instvar ns_ numImg_ numGet_ numPut_ client_ server_ tStart_ psz_	if {$numPut_ == 0} {		set len [rvValue $rvRepLen_ round]	} else {		set num [expr $phttp_ ? $numImg_ : 1]		for {set i [set len 0]} {$i < $num} {incr i} {			incr len [rvValue $rvImgLen_ round]		}	}#	puts "$self reply [$server_($id) set agent_] $len [$ns_ now]"	set cmd "$self transmit $server_($id) $len"	set tServer [rvValue $rvServerTime_]	if {$tServer > 0} {		$ns_ at [expr $tServer+[$ns_ now]] $cmd	} else {		eval $cmd	}}Http instproc doneReply {id} {	$self instvar phttp_ maxConn_ rvClientTime_ rvServerTime_	$self instvar rvReqLen_ rvRepLen_ rvNumImg_ rvImgLen_	$self instvar ns_ numImg_ numGet_ numPut_ client_ server_ tStart_	set idlist $id	if {$numPut_ == 0} {		set numImg_ [rvValue $rvNumImg_ round]		for {set i 1} {$i < $maxConn_} {incr i} {			lappend idlist $i		}	}	if {[incr numPut_] > $numImg_} {		$self donePage		return	}	# set numGet_ and numPut_ as if only 1 more request is needed	foreach id $idlist {		if {[incr numGet_] > $numImg_} break		if {$phttp_} {			set numGet_ $numImg_			set numPut_ $numImg_		}		set len [rvValue $rvReqLen_ round]		$self transmit $client_($id) $len 1#		puts "$self reqI$numGet_ $id [$client_($id) set agent_] $len [$ns_ now]"	}}Http instproc donePage {} {	$self instvar phttp_ maxConn_ rvClientTime_ rvServerTime_	$self instvar ns_ numImg_ numGet_ numPut_ sessionLen_ \			client_ server_ tStart_	set now [$ns_ now]	set ct [rvValue $rvClientTime_]	set out [format "%.3f %.0f %d %.3f" [expr $now - $tStart_] [expr $numImg_+1] $sessionLen_ $ct]	set curtime [format "%.3f" $now]	# print "curtime transaction_time num_connections sessionlen thinktime"	puts "$curtime Http $self donePage $out"	$ns_ at [expr $now + $ct] "$self start"}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -