Updated 2007-06-19 13:10:37 by escargo

Todd Coram Hyping Tcl's powerful Networking Capabilities... Below is a simple, line-oriented, event-driven, multiple-client server template.
 proc register_client {line_cmd open_cmd close_cmd chan add port} {
    # We want whole lines
    #
    fconfigure $chan -blocking 0 -buffering line

    # Invoke a proc to notify us that a client has registered.
    #
    eval $open_cmd $chan

    # Set up a fileevent to handle input
    #
    fileevent $chan readable [list handle_input $chan $line_cmd $close_cmd]
 }

 # Handle a complete line of input.
 #
 proc handle_input {chan cmd close_cmd} {
    if {![eof $chan]} {
	if {[gets $chan data] == -1} {
	    return;			# only handle complete lines
	}
    } else {
	# Close up the channel and notify us that a client was disconnected.
	#
	fileevent $chan readable {}
	catch {close $chan}
	eval $close_cmd $chan
	return
    }
    # Handle the line of data
    #
    eval $cmd $chan \$data;		# don't expand $data, pass as single arg
 }

 #
 # Fill in these procs with your program logic
 #

 proc bgerror {msg} {
    # Handle unexpected errors here.
    # puts "Ack! $msg"
 }

 proc handle_line {chan line} {
    # Handle a line of input
    # puts "Got $line from $chan"
 }

 proc finished {chan} {
    # Connection has been terminated.
    # puts "Goodbye $chan!"
 }

 proc hello {chan} {
    # Connection has been accepted.
    # puts "Hello $chan!"
 }

 #
 # Start a server on port 6668
 #

 socket -server [list register_client handle_line hello finished] 6668
 vwait ::forever_and_ever_in_a_mainloop

Category Example - Category Interprocess Communication - Category Networking