diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2004-05-28 12:23:50 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2004-05-28 12:23:50 (GMT) |
commit | 0cb68aa767f2457c65b8cbc4d27c29545da80744 (patch) | |
tree | 3b4395dea7450721ae8d0c5a74fdb25d861d56d6 /doc/fblocked.n | |
parent | 335355daaf50f042b321f273165959f0898c8185 (diff) | |
download | tcl-0cb68aa767f2457c65b8cbc4d27c29545da80744.zip tcl-0cb68aa767f2457c65b8cbc4d27c29545da80744.tar.gz tcl-0cb68aa767f2457c65b8cbc4d27c29545da80744.tar.bz2 |
Added example
Diffstat (limited to 'doc/fblocked.n')
-rw-r--r-- | doc/fblocked.n | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/doc/fblocked.n b/doc/fblocked.n index 7f8fe54..0132a7b 100644 --- a/doc/fblocked.n +++ b/doc/fblocked.n @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: fblocked.n,v 1.4 2001/09/14 19:20:40 andreas_kupries Exp $ +'\" RCS: @(#) $Id: fblocked.n,v 1.5 2004/05/28 12:23:50 dkf Exp $ .so man.macros .TH fblocked n 7.5 Tcl "Tcl Built-In Commands" .BS @@ -31,9 +31,43 @@ Tcl standard channel (\fBstdin\fR, \fBstdout\fR, or \fBstderr\fR), the return value from an invocation of \fBopen\fR or \fBsocket\fR, or the result of a channel creation command provided by a Tcl extension. .VE +.SH EXAMPLE +The \fBfblocked\fR command is particularly useful when writing network +servers, as it allows you to write your code in a line-by-line style +without preventing the servicing of other connections. This can be +seen in this simple echo-service: + +.CS +# This is called whenever a new client connects to the server +proc connect {chan host port} { + set clientName [format <%s:%d> $host $port] + puts "connection from $clientName" + fconfigure $chan -blocking 0 -buffering line + fileevent $chan readable [list echoLine $chan $clientName] +} + +# This is called whenever either at least one byte of input +# data is available, or the channel was closed by the client. +proc echoLine {chan clientName} { + gets $chan line + if {[eof $chan]} { + puts "finishing connection from $clientName" + close $chan + } elseif {![\fBfblocked\fR $chan]} { + # Didn't block waiting for end-of-line + puts "$clientName - $line" + puts $chan $line + } +} + +# Create the server socket and enter the event-loop to wait +# for incoming connections... +socket -server connect 12345 +vwait forever +.CE .SH "SEE ALSO" -gets(n), open(n), read(n), Tcl_StandardChannels(3) +gets(n), open(n), read(n), socket(n), Tcl_StandardChannels(3) .SH KEYWORDS blocking, nonblocking |