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

📄 many_tcp.tcl

📁 跑leach需要的
💻 TCL
📖 第 1 页 / 共 2 页
字号:
# Get the number of the node pairMain instproc get_node_number { client_number } {        global opts        if {$opts(node-number) > 0} {                set node [expr $client_number % $opts(node-number)]        } else {                set node $client_number        }        return $node}# return the client indexMain instproc create_a_client {} {	global opts	$self instvar cs_l_ cs_r_ sources_ cs_count_ ns_ rng_	# Get the client number for the new client.	set now [$ns_ now]	set i $cs_count_	incr cs_count_	set node $i	if {[expr $i % 100] == 0} {		puts "t=[format %.3f $now]: client $i created"	}	# Get the source and sink nodes.	if {$opts(node-number) > 0} {		if {$node < $opts(node-number) } {			$self create_client_nodes $node		} else {			set node [$self get_node_number $i]		}	} else {		$self create_client_nodes $node	}	if {$opts(debug)} {		# puts "t=[format %.3f $now]: client $i uses node pair $node"	}		# create sources and sinks in both directions	# (actually, only one source per connection, for now)	if {[$rng_ integer 100] < $opts(client-reverse-chance)} {		set sources_($i) [$ns_ create-connection-list $opts(source-tcp-method) $cs_r_($node) $opts(sink-ack-method) $cs_l_($node) $i]	} else {		set sources_($i) [$ns_ create-connection-list $opts(source-tcp-method) $cs_l_($node) $opts(sink-ack-method) $cs_r_($node) $i]	}	[lindex $sources_($i) 0] set maxpkts_ 0	[lindex $sources_($i) 0] set packetSize_ $opts(client-pkt-size)	# Set up a callback when this client ends.	[lindex $sources_($i) 0] proc done {} "$self finish_a_client $i"	if {$opts(debug)} {		# puts "t=[$ns_ now]: client $i created"	}	return $i}## Make a batch of clients to amortize the cost of routing recomputation# (actually no longer improtant).#Main instproc create_some_clients {} {	global opts	$self instvar idle_clients_ ns_ cs_count_	set now [$ns_ now]	set step 16	if {$opts(debug)} {		puts "t=[format %.3f $now]: creating clients $cs_count_ to [expr $cs_count_ + $step - 1]"	}	for {set i 0} {$i < $step} {incr i} {		lappend idle_clients_ [$self create_a_client]	}	# debugging:	# puts "after client_create:"	# $ns_ gen-map	# $self instvar bottle_l_ bottle_r_	# puts "bottle_l_ classifier_:"	# [$bottle_l_ set classifier_] dump	# puts "bottle_r_ classifier_:"	# [$bottle_r_ set classifier_] dump}Main instproc start_a_client {} {	global opts	$self instvar idle_clients_ ns_ sources_ rng_ source_start_ source_size_ clients_started_	set i ""	set now [$ns_ now]	# can we reuse a dead client?	if {![info exists idle_clients_]} {		set idle_clients_ ""	}	while {$idle_clients_ == ""} {		$self create_some_clients	}	set i [lindex $idle_clients_ 0]	set idle_clients_ [lrange $idle_clients_ 1 end]	# Reset the connection.	[lindex $sources_($i) 0] reset	[lindex $sources_($i) 1] reset 	# Start traffic for that client.	if {[$rng_ integer 100] < $opts(client-mouse-chance)} {		set len $opts(client-mouse-packets)	} else {		set len $opts(client-elephant-packets)	}	[lindex $sources_($i) 0] advanceby $len	set source_start_($i) $now	set source_size_($i) $len	if {$opts(debug)} {		 # puts "t=[$ns_ now]: client $i started, ldelay=[format %.6f $ldelay], rdelay=[format %.6f $rdelay]"		puts "t=[format %.3f $now]: client $i started"	}	incr clients_started_}Main instproc finish_a_client {i} {	global opts	$self instvar ns_ idle_clients_ source_start_ source_size_ clients_finished_	set now [$ns_ now]	if {$opts(debug)} {		set delta [expr $now - $source_start_($i)]		puts "t=[format %.3f $now]: client $i finished ($source_size_($i) pkts, $delta s)"	}	lappend idle_clients_ $i	incr clients_finished_}Main instproc schedule_continuing_traffic {} {	global opts	$self instvar ns_ rng_	$self start_a_client	# schedule the next one	set next [expr [$ns_ now]+([$rng_ exponential]/$opts(client-arrival-rate))]	if {$opts(debug)} {		# puts "t=[$ns_ now]: next continuing traffic at $next"	}	$ns_ at $next "$self schedule_continuing_traffic"}Main instproc schedule_initial_traffic {} {	global opts	# Start with no pending clients.	$self instvar idle_clients_	# Start initial clients.	for {set i 0} {$i < $opts(initial-client-count)} {incr i} {		$self start_a_client	}}Main instproc open_trace { stop_time } {	global opts	$self instvar ns_ trace_file_ nam_trace_file_ trace_filename_	set trace_filename_ $opts(trace-filename)	exec rm -f "$trace_filename_.tr"	set trace_file_ [open "$trace_filename_.tr" w]	set stop_actions "close $trace_file_"	if {$opts(namtrace-some) || $opts(namtrace-all)} {		exec rm -f "$trace_filename_.nam"		set nam_trace_file_ [open "$trace_filename_.nam" w]		set $stop_actions "$stop_actions; close $nam_trace_file_"	} else {		set nam_trace_file_ ""	}	$ns_ at $stop_time "$stop_actions; $self finish"	return "$trace_file_ $nam_trace_file_"}# There seems to be a problem with the foll function, so quit plotting # with -a -q, use just -a.Main instproc finish {} {        global opts fmon PERL	$self instvar trace_filename_ ns_ cs_count_ clients_started_ clients_finished_	puts "total clients started: $clients_started_"	puts "total clients finished: $clients_finished_"	if {$opts(print-drop-rate)} {		set drops [$fmon set pdrops_]		set pkts [$fmon set parrivals_]		puts "total_drops $drops total_packets $pkts"		set droprate [expr 100.0*$drops / $pkts ]		puts [format "drop_percentage %7.4f" $droprate]	}        if {$opts(trace-filename) != "none"} {		set title $opts(title)                set flow_factor 1                if {$opts(graph-scale) == "2"} {                        set flow_factor 100                }		# Make sure that we run in place even without raw2xg in our path		# (for the test suites).		set raw2xg raw2xg		if [file exists ../../bin/raw2xg] {			set raw2xg ../../bin/raw2xg		}		set raw2xg_opts ""		if {$opts(graph-join-queueing)} {			set raw2xg_opts "$raw2xg_opts -q"		}		# always run raw2xg because maybe we need the output		set cmd "$raw2xg -a $raw2xg_opts -n $flow_factor < $trace_filename_.tr >$trace_filename_.xg"		eval "exec $PERL $cmd"		if {$opts(graph-results)} {			if {$opts(graph-join-queueing)} {				exec xgraph -t $title  < $trace_filename_.xg &			} else {				exec xgraph -tk -nl -m -bb -t $title < $trace_filename_.xg &			}		}		if {$opts(test-suite)} {			exec cp $trace_filename_.xg $opts(test-suite-file)		}	#	exec raw2xg -a < out.tr | xgraph -t "$opts(server-tcp-method)" &	}	if {$opts(mem-trace)} {		$ns_ clearMemTrace	}	exit 0}Main instproc trace_stuff {} {	global opts	$self instvar bottle_l_ bottle_r_ ns_ trace_file_ nam_trace_file_	$self open_trace $opts(duration)	if {$opts(trace-all)} {		$ns_ trace-all $trace_file_	}	if {$opts(namtrace-all)} {		$ns_ namtrace-all $nam_trace_file_	} elseif {$opts(namtrace-some)} {# xxx		$bottle_l_ dump-namconfig		$bottle_r_ dump-namconfig		[$ns_ link $bottle_l_ $bottle_r_] dump-namconfig		$ns_ namtrace-queue $bottle_l_ $bottle_r_ $nam_trace_file_		$ns_ namtrace-queue $bottle_r_ $bottle_l_ $nam_trace_file_	}	# regular tracing.	# trace left-to-right only       	$ns_ trace-queue $bottle_l_ $bottle_r_ $trace_file_       	$ns_ trace-queue $bottle_r_ $bottle_l_ $trace_file_		# Currently tracing is somewhat broken because	# of how the plumbing happens.}Main instproc init {av} {	global opts	$self process_args $av	$self instvar ns_ 	set ns_ [new Simulator]        # Seed random no. generator; ns-random with arg of 0 heuristically        # chooses a random number that changes on each invocation.	$self instvar rng_	set rng_ [new RNG]	$rng_ seed $opts(ns-random-seed)	$rng_ next-random	$self init_network	if {$opts(trace-filename) == "none"} {		$ns_ at $opts(duration) "$self finish"	} else {		$self trace_stuff	}	# xxx: hack (next line)#	$self create_some_clients	$ns_ at 0 "$self schedule_initial_traffic"	if {$opts(client-arrival-rate) != 0} {		$ns_ at 0 "$self schedule_continuing_traffic"	}	if {$opts(gen-map)} {		$ns_ gen-map	}       	Agent/TCP set syn_ true	Agent/TCP set delay_growth_ true	Agent/TCP set windowInit_ 1	Agent/TCP set windowInitOption_ 1	if {$opts(init-win) == "0"} {		Agent/TCP set windowInitOption_ 2	} elseif {$opts(init-win) == "10"} {		Agent/TCP set windowInitOption_ 1		Agent/TCP set windowInit_ 10	} elseif {$opts(init-win) == "20"} {		Agent/TCP set windowInitOption_ 1		Agent/TCP set windowInit_ 20		puts "init-win 20"	}	$ns_ run}global in_test_suiteif {![info exists in_test_suite]} {	global $argv	new Main $argv}

⌨️ 快捷键说明

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