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

通讯编程

开发平台:

Visual C++

  1. #Copyright (c) 1997 Regents of the University of California.
  2. # All rights reserved.
  3. #
  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 Computer Systems
  15. #      Engineering Group at Lawrence Berkeley Laboratory.
  16. # 4. Neither the name of the University nor of the Laboratory may be used
  17. #    to endorse or promote products derived from this software without
  18. #    specific prior written permission.
  19. #
  20. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  21. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  24. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  26. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30. # SUCH DAMAGE.
  31. #
  32. # Each agent keeps track of what messages it has seen
  33. # and only forwards those which it hasn't seen before.
  34. # Each message is of the form "ID:DATA" where ID is some arbitrary
  35. # message identifier and DATA is the payload.  In order to reduce
  36. # memory usage, the agent stores only the message ID.
  37. # Note that I have not put in any mechanism to expire old message IDs
  38. # from the list of seen messages.  There also isn't any standard mechanism
  39. # for assigning message IDs.  An actual assignment may wish to have the
  40. # students come up with solutions for these problems.
  41. set MESSAGE_PORT 42
  42. # parameters for topology generator
  43. set group_size 7
  44. set num_groups 5
  45. set num_nodes [expr $group_size * $num_groups]
  46. set ns [new Simulator]
  47. set f [open flooding.tr w]
  48. $ns trace-all $f
  49. set nf [open flooding.nam w]
  50. $ns namtrace-all $nf
  51. # subclass Agent/MessagePassing to make it do flooding
  52. Class Agent/MessagePassing/Flooding -superclass Agent/MessagePassing
  53. Agent/MessagePassing/Flooding instproc send_message {size msgid msg} {
  54.     $self instvar messages_seen node_
  55.     global ns MESSAGE_PORT
  56.     $ns trace-annotate "Node [$node_ node-addr] is sending {$msgid:$msg}"
  57.     lappend messages_seen $msgid
  58.     $self send_to_neighbors -1 $MESSAGE_PORT $size "$msgid:$msg"
  59. }
  60. Agent/MessagePassing/Flooding instproc send_to_neighbors {skip port size data} {
  61.     $self instvar node_
  62. foreach x [$node_ neighbors] {
  63.     set addr [$x set address_]
  64.     if {$addr != $skip} {
  65. $self sendto $size $data $addr $port
  66.     }
  67. }
  68. }
  69. Agent/MessagePassing/Flooding instproc recv {source sport size data} {
  70.     $self instvar messages_seen node_
  71.     global ns
  72.     # extract message ID from message
  73.     set message_id [lindex [split $data ":"] 0]
  74.     if {[lsearch $messages_seen $message_id] == -1} {
  75. lappend messages_seen $message_id
  76.         $ns trace-annotate "Node [$node_ node-addr] received {$data}"
  77. $self send_to_neighbors $source $sport $size $data
  78.     } else {
  79. $ns trace-annotate "Node [$node_ node-addr] received redundant copy of message #$message_id"
  80.     }
  81. }
  82. ## Topology Generator
  83. # create a bunch of nodes
  84. for {set i 0} {$i < $num_nodes} {incr i} {
  85.     set n($i) [$ns node]
  86. }
  87. # create links between the nodes
  88. for {set g 0} {$g < $num_groups} {incr g} {
  89.     for {set i 0} {$i < $group_size} {incr i} {
  90.         $ns duplex-link $n([expr $g*$group_size+$i]) $n([expr $g*$group_size+($i+1)%$group_size]) 2Mb 15ms DropTail
  91.     }
  92.     $ns duplex-link $n([expr $g*$group_size]) $n([expr (($g+1)%$num_groups)*$group_size+2]) 2Mb 15ms DropTail
  93.     if {$g%2} {
  94.         $ns duplex-link $n([expr $g*$group_size+3]) $n([expr (($g+3)%$num_groups)*$group_size+1]) 2Mb 15ms DropTail
  95.     }
  96. }
  97. # attach a new Agent/MessagePassing/Flooding to each node on port $MESSAGE_PORT
  98. for {set i 0} {$i < $num_nodes} {incr i} {
  99.     set a($i) [new Agent/MessagePassing/Flooding]
  100.     $n($i) attach  $a($i) $MESSAGE_PORT
  101.     $a($i) set messages_seen {}
  102. }
  103. # now set up some events
  104. $ns at 0.2 "$a(5) send_message 900 1 {first message}"
  105. $ns at 0.5 "$a(17) send_message 700 2 {another one}"
  106. $ns at 1.0 "$a(24) send_message 500 abc {yet another one}"
  107. $ns at 2.0 "finish"
  108. proc finish {} {
  109.         global ns f nf
  110.         $ns flush-trace
  111.         close $f
  112.         close $nf
  113.         puts "running nam..."
  114.         exec nam flooding.nam &
  115.         exit 0
  116. }
  117. $ns run