Simple TCP/IP proxy

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.

Category Networking