From 0f4cb39eb1ebaf3cc931b450b517a177beb8c05e Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Thu, 12 Aug 2010 12:21:18 +1000 Subject: Make udp sockets useful Separate socket types: udp client and udp server Allow client sockets to 'connect' to an address Allow server sockets to 'bind' to an address Add support for 'sendto' and 'recvfrom' Add socket client and server examples Document new udp sockets Signed-off-by: Steve Bennett --- examples/tcp.client | 9 +++++++++ examples/tcp.server | 36 ++++++++++++++++++++++++++++++++++++ examples/udp.client | 11 +++++++++++ examples/udp.server | 25 +++++++++++++++++++++++++ examples/udp2.client | 13 +++++++++++++ 5 files changed, 94 insertions(+) create mode 100644 examples/tcp.client create mode 100644 examples/tcp.server create mode 100644 examples/udp.client create mode 100644 examples/udp.server create mode 100644 examples/udp2.client (limited to 'examples') diff --git a/examples/tcp.client b/examples/tcp.client new file mode 100644 index 0000000..ed8582b --- /dev/null +++ b/examples/tcp.client @@ -0,0 +1,9 @@ +# Example of sending via a connected tcp socket + +set s [socket stream 127.0.0.1:20000] + +foreach i [range 1 20] { + $s puts "1 << $i" + + puts [$s gets] +} diff --git a/examples/tcp.server b/examples/tcp.server new file mode 100644 index 0000000..ef71fe5 --- /dev/null +++ b/examples/tcp.server @@ -0,0 +1,36 @@ +# Example of a udp server which sends a response + +# Listen on port 20000. No host specified means 0.0.0.0 +set s [socket stream.server 20000] + +$s readable { + set sock [$s accept] + + # Make this server forking so we can accept multiple + # simultaneous connections + if {[os.fork] == 0} { + $s close + + # Get the request (max 80 chars) - need the source address + while {[$sock gets buf] >= 0} { + set buf [string trim $buf] + puts -nonewline "read '$buf'" + + try { + set result "$buf = [expr $buf]" + } on error {msg} { + set result "Error: $buf => $msg" + } + + puts ", sending '$result'" + + # Send the result back to where it came from + $sock puts $result + $sock flush + } + } + + $sock close +} + +vwait done diff --git a/examples/udp.client b/examples/udp.client new file mode 100644 index 0000000..32dbc02 --- /dev/null +++ b/examples/udp.client @@ -0,0 +1,11 @@ +# Example of sending from an unconnected socket + +set s [socket dgram] + +foreach i [range 1 20] { + # Specify the address and port with sendto + $s sendto "$i + $i + 10" 127.0.0.1:20000 + + # Receive the response - max length of 100 + puts [$s recvfrom 100] +} diff --git a/examples/udp.server b/examples/udp.server new file mode 100644 index 0000000..c462647 --- /dev/null +++ b/examples/udp.server @@ -0,0 +1,25 @@ +# Example of a udp server which sends a response + +# Listen on port 20000. No host specified means 0.0.0.0 +set s [socket dgram.server 20000] + +# 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 $addr" + + try { + set result "$buf = [expr $buf]" + } on error {msg} { + set result "Error: $buf => $msg" + } + + puts ", sending '$result'" + + # Send the result back to where it came from + $s sendto $result $addr +} + +vwait done diff --git a/examples/udp2.client b/examples/udp2.client new file mode 100644 index 0000000..776dc2c --- /dev/null +++ b/examples/udp2.client @@ -0,0 +1,13 @@ +# Example of sending via a connected udp socket + +set s [socket dgram 127.0.0.1:20000] + +foreach i [range 1 20] { + # Socket is connected, so can just use puts here + # But remember to flush to ensure that each message is separate + $s puts -nonewline "$i * $i" + $s flush + + # Receive the response - max length of 100 + puts [$s recvfrom 100] +} -- cgit v1.1