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

通讯编程

开发平台:

Visual C++

  1. source timer.tcl
  2. global ns
  3. set ns [new Simulator]
  4. $ns color 0 blue
  5. $ns color 1 red
  6. $ns color 2 darkgreen
  7. set n0 [$ns node]
  8. set n1 [$ns node]
  9. set n2 [$ns node]
  10. set n3 [$ns node]
  11. puts n0=[$n0 id]
  12. puts n1=[$n1 id]
  13. puts n2=[$n2 id]
  14. puts n3=[$n3 id]
  15. set f [open out.tr w]
  16. $ns trace-all $f
  17. set nf [open out.nam w]
  18. $ns namtrace-all $nf
  19. #$ns duplex-link $n0 $n1 1.5Mb 10ms DropTail
  20. $ns duplex-link $n0 $n2 10Mb 2ms DropTail
  21. $ns duplex-link $n1 $n2 10Mb 2ms DropTail
  22. $ns duplex-link $n2 $n3 1.5Mb 10ms DropTail
  23. $ns duplex-link-op $n0 $n2 orient right-up
  24. $ns duplex-link-op $n1 $n2 orient right-down
  25. $ns duplex-link-op $n2 $n3 orient right
  26. $ns duplex-link-op $n2 $n3 queuePos 0.5
  27. $ns queue-limit $n2 $n3 8
  28. Class Sender -superclass {Agent/Message Timer}
  29. Class Receiver -superclass Agent/Message
  30. Sender instproc init {} {
  31. $self next
  32. $self reset
  33. $self set window_ 4
  34. }
  35. Sender instproc reset {} {
  36. $self instvar seqno_ ack_
  37. set seqno_ 0
  38. set ack_ 0
  39. }
  40. Sender instproc start {} {
  41. $self transmit
  42. }
  43. Sender instproc reset_timer {} {
  44. $self cancel
  45. $self sched 0.05
  46. }
  47. Sender instproc timeout {} {
  48. $self instvar seqno_ ack_
  49. set seqno_ $ack_
  50. $self transmit
  51. }
  52. Sender instproc cansend {} {
  53. $self instvar seqno_ window_ ack_
  54. return [expr $seqno_ < $ack_ + $window_]
  55. }
  56. Sender instproc sendnext {} {
  57. $self instvar seqno_
  58. $self send $seqno_
  59. incr seqno_
  60. $self reset_timer
  61. }
  62. Sender instproc transmit {} {
  63. while [$self cansend] {
  64. $self sendnext
  65. }
  66. }
  67. Sender instproc recv msg {
  68. $self instvar ack_
  69. set ack_ $msg
  70. $self transmit
  71. }
  72. Sender set packetSize_ 400
  73. Receiver set packetSize_ 40
  74. Receiver instproc init {} {
  75. $self next
  76. $self reset
  77. }
  78. Receiver instproc reset {} {
  79. $self instvar ack_
  80. set ack_ 0
  81. }
  82. Receiver instproc recv msg {
  83. set seqno $msg
  84. $self instvar ack_
  85. if { $seqno == $ack_ } {
  86. incr ack_ 
  87. }
  88. $self send $ack_
  89. }
  90. set sndr [new Sender]
  91. $ns attach-agent $n0 $sndr
  92. $sndr set fid_ 0
  93. set rcvr [new Receiver]
  94. $ns attach-agent $n3 $rcvr
  95. $rcvr set fid_ 1
  96. $ns connect $sndr $rcvr
  97. $sndr set window_ 1
  98. # start up - stop-and-wait
  99. $ns at 0.0 "$sndr start"
  100. # do pipelining
  101. $ns at 0.2 "$sndr set window_ 6"
  102. # cause queue overflow
  103. $ns at 0.4 "$sndr reset; $rcvr reset; $sndr set window_ 10"
  104. $ns at 0.6 "$ns queue-limit $n2 $n3 20"
  105. $ns at 0.8 "$sndr set window_ 14"
  106. $ns at 1.0 "finish"
  107. proc finish {} {
  108. global nf
  109. close $nf
  110. puts "running nam..."
  111. exec nam out.nam &
  112. exit 0
  113. }
  114. $ns run