Posted to tcl by evilotto at Fri Feb 03 20:51:11 GMT 2012view pretty

Program 1, the server:
socket -server acceptit 12345
proc acceptit {chan ca cp} {
   after 100 "sendit $chan"
}
proc sendit {chan} {
   puts $chan hi!
   close $chan
}
vwait forever

Program 2, the proxy (the one that exhibits bad behavior):
socket -server proxyit 12344
proc proxyit {chan ca cp} {
    fconfigure $chan -blocking 0
    set ds [socket -async localhost 12345]
    fconfigure $ds -blocking 0
    fileevent $ds readable "writeit $ds $chan"
}
proc writeit {ds chan} {
    puts stderr "write $ds -> $chan"
    set d [read $ds]
    if {[eof $ds]} {
        puts "eof read $ds"
        close $ds
	close $chan
    } else {
	puts stderr "not eof $ds, data = '$d'"
        puts -nonewline $chan $d
	if {[eof $chan]} {
	    puts "eof puts $chan"
	    close $chan
	    close $ds
	}
    }
}
vwait forever

Program 3, the trigger:
 for {set i 0} {$i < 16} {incr i} {lappend s [socket localhost 12344]}

using 15 here doesn't trigger the bug, 16 does