MC 14 Oct 2004: Tcl's socket command and non-blocking I/O makes it very easy to do all sorts of fun network things.
Here is an example to proxy/forward in just a few lines of code. I wrote this during the intro to DRH's SQLite talk at the Eleventh Annual Tcl/Tk Conference, since some router somewhere between the hotel and mini.net wasn't routing properly.
set host mini.net set port 80 set self 166.70.107.100 proc accept {sock addr p} { global host port set conn [socket -async $host $port] fconfigure $sock -translation binary -buffering none -blocking 0 fconfigure $conn -translation binary -buffering none -blocking 0 fileevent $conn readable [list xfer $conn $sock] fileevent $sock readable [list xfer $sock $conn] } proc xfer {from to} { if {([eof $from] || [eof $to]) || ([catch {read $from} data] || [catch {puts -nonewline $to $data}])} { catch {close $from} catch {close $to} } } set server [socket -server accept -myaddr $self 80] vwait forever
vkvalli: A bandwidth throttling proxy based on this.