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:

http://www.linuxquestions.org/questions/programming-9/writing-to-and-reading-from-a-socket-from-bash-script-794812/

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/

Tags: , , , , , ,

One Response to “Using BASH for network socket operation”

  1. Writing to and reading from a socket from bash script. Says:

    [...] 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 [...]

Leave a Reply

You must be logged in to post a comment.