Using BASH for network socket operation
In order to solve a programming assignment (send a “TEST” to an UDP service and readout the result [beeing "success"]) i looked into socket programming with the BASH command shell.
Here is the code:
# configuration
HOST="127.0.0.1"
PORT="1337"
# define functions
socksend ()
{
SENDME="$1"
echo "sending: $SENDME"
echo -ne "$SENDME" >&5 &
}
sockread ()
{
LENGTH="$1"
RETURN=`dd bs=$1 count=1 <&5 2> /dev/null`
}
echo "trying to open socket"
# try to connect
if ! exec 5<> /dev/udp/$HOST/$PORT; then
echo "`basename $0`: unable to connect to $HOST:$PORT"
exit 1
fi
echo "socket is open"
# send request
socksend "TEST"
# read 7 bytes for "success"
sockread 7
echo "RETURN: $RETURN"
The procedure is fairly easy:
- create a filedescriptor (using number 5 because 0,1,2 are for system stdin/stdout/stderr, so i am on the safe side) and link it to the special device /dev/udp (/dev/tcp for tcp connections).
- read/write to the fd
Attention: your bash must be compiled with this feature, otherwise there wont be any /dev/udp or /dev/tcp devices.
My post should answer the question posted here:
Also, i stumbled across those pages which where quite helpful for getting started:
http://blogmag.net/blog/read/49/Network_programing_with_bash
http://thesmithfam.org/blog/2006/05/23/bash-socket-programming-with-devtcp-2/
June 9th, 2010 at 12:37 am
[...] RETURN=`dd bs=$1 count=1 <&5 2> /dev/null` with $1 beeing the amount of bytes to read. this wont block while reading the result. the complete script can be found here: http://blog.chris007.de/?p=238 [...]