From fe8bab1cc313d0049bbb839589c68059807518c8 Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Tue, 8 Nov 2011 17:56:11 +1000 Subject: aio: Add dgram unix socket support Also add support for sockname and peername And remove unix domain sockets when the socket is closed And generally clean up the socket support Signed-off-by: Steve Bennett --- examples/unix.client | 9 +++++++++ examples/unix.dgram.client | 18 +++++++++++++++++ examples/unix.dgram.server | 35 +++++++++++++++++++++++++++++++++ examples/unix.server | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 110 insertions(+) create mode 100644 examples/unix.client create mode 100644 examples/unix.dgram.client create mode 100644 examples/unix.dgram.server create mode 100644 examples/unix.server (limited to 'examples') diff --git a/examples/unix.client b/examples/unix.client new file mode 100644 index 0000000..12a5bf8 --- /dev/null +++ b/examples/unix.client @@ -0,0 +1,9 @@ +# Example of sending via a connected tcp socket + +set s [socket unix unix.tmp] + +foreach i [range 1 20] { + $s puts "expr {1 << $i}" + + puts [$s gets] +} diff --git a/examples/unix.dgram.client b/examples/unix.dgram.client new file mode 100644 index 0000000..d9dd8ca --- /dev/null +++ b/examples/unix.dgram.client @@ -0,0 +1,18 @@ +# Example of sending from an unconnected socket + +# Now sending via a connected udp socket + +set s [socket unix.dgram unix.sock] +$s buffering none + +puts "dgram socket [$s sockname] connected to [$s peername]" + +foreach i [range 5 10] { + # Socket is connected, so can just use puts here + # No need to flush because we set 'buffering none' above. + $s puts -nonewline "$i * $i" + #$s flush + + # Receive the response - max length of 100 + puts [$s recvfrom 100] +} diff --git a/examples/unix.dgram.server b/examples/unix.dgram.server new file mode 100644 index 0000000..43ada19 --- /dev/null +++ b/examples/unix.dgram.server @@ -0,0 +1,35 @@ +# Example of a udp server which sends a response + +# Listen on port 20000. No host specified means 0.0.0.0 +file delete unix.sock +set s [socket unix.dgram.server unix.sock] + +puts "Listening on dgram socket [$s sockname]" + +set count 0 + +# For each request... +$s readable { + # Get the request (max 80 chars) - need the source address + set buf [$s recvfrom 80 addr] + + puts -nonewline "read '$buf' from client $addr" + + try { + set result "$buf = [expr $buf]" + } on error {msg} { + set result "Error: $buf => $msg" + } + + puts ", sending '$result' to client $addr" + + # Send the result back to where it came from + $s sendto $result $addr +} + +# Handle signals so the socket is removed on exit +signal handle SIGINT SIGTERM + +catch -signal { + vwait done +} diff --git a/examples/unix.server b/examples/unix.server new file mode 100644 index 0000000..fa52992 --- /dev/null +++ b/examples/unix.server @@ -0,0 +1,48 @@ +# Example of a unix domain stream server which sends a response + +file delete unix.tmp +set s [socket unix.server unix.tmp] + +puts "Listening on [$s sockname]" + +$s readable { + # Clean up children + wait -nohang 0 + set sock [$s accept] + + # Make this server forking so we can accept multiple + # simultaneous connections + if {[os.fork] == 0} { + # We don't want the unix domain path to be deleted here + $s close -nodelete + + $sock buffering line + + # Get the requests, one line at a time an evaluate + while {[$sock gets buf] >= 0} { + set buf [string trim $buf] + if {$buf in {? help}} { + set result "Enter any Tcl command to run in the server" + } else { + try { + set result [eval $buf] + set result [string map [list \\ \\\\ \n \\n \r \\r] $result] + } on error {msg} { + set result "Error: $buf => $msg" + } + } + + # Send the result back to where it came from + $sock puts $result + } + } + + $sock close +} + +# Handle signals so the socket is removed on exit +signal handle SIGINT SIGTERM + +catch -signal { + vwait done +} -- cgit v1.1