aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2011-11-08 17:56:11 +1000
committerSteve Bennett <steveb@workware.net.au>2019-07-01 11:14:58 +1000
commitfe8bab1cc313d0049bbb839589c68059807518c8 (patch)
tree53a089d480d57903b004065acda88870f4ad5f4e /examples
parenteb6b2dcdc6345acd09ae593469abaf76b6b6fdfe (diff)
downloadjimtcl-fe8bab1cc313d0049bbb839589c68059807518c8.zip
jimtcl-fe8bab1cc313d0049bbb839589c68059807518c8.tar.gz
jimtcl-fe8bab1cc313d0049bbb839589c68059807518c8.tar.bz2
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 <steveb@workware.net.au>
Diffstat (limited to 'examples')
-rw-r--r--examples/unix.client9
-rw-r--r--examples/unix.dgram.client18
-rw-r--r--examples/unix.dgram.server35
-rw-r--r--examples/unix.server48
4 files changed, 110 insertions, 0 deletions
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
+}