Version 1 of A socket bridge

Updated 2008-07-19 00:02:54 by aspect

From a request by GPS on Tclers' chat, came this simple server as a socket demo. Data from each client is simply relayed to the other, like on a telephone bridge.

Extending to more than 2 parties is left as an excercise.

  array set socks {}

  proc makebridge {p0 p1} {
      set l0 [socket -server [list connect 0] $p0]
      set l1 [socket -server [list connect 1] $p1]

  }

  proc connect {p sock addr port} {
      puts "Client on port $p: $sock from $addr:$port"
      global socks
      set socks($p) $sock
      fconfigure $sock -buffering none
      fconfigure $sock -blocking no
      fileevent $sock readable [list bridge $p]
  }

  proc bridge {p} {
      set q [expr {!$p}]
      global socks
      puts "woo! $p -> $q"
      if {[eof $socks($p)] || [catch {set data [read $socks($p)]}]} {
          puts "Close port $p: $::errorInfo"
          close $socks($p)
          close $socks($q)
          array set socks {}
      } else {
          puts "Data on $p: $data"
          puts -nonewline $socks($q) $data
      }
  }

  makebridge 2000 2001
  vwait forever