help-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Help-bash] bi-directional socket client / server example code?


From: John Kearney
Subject: Re: [Help-bash] bi-directional socket client / server example code?
Date: Mon, 17 Jun 2013 20:03:18 +0200

to give you a rough idea what this can look like.
Note: this server is only thought to be for 1 client if you want to support multiple clients you will need something like tcpserver.



rm_file(){
  [ ! -e "${1}" ] || rm "${1}"
}
Cleanup() {
  for cjob in $(jobs -p) ;do
    kill -s SIGTERM "${cjob}"
  done
  rm_file /tmp/$$_srv_in
  rm_file /tmp/$$_srv_out
  rm_file /tmp/$$_clnt_in
  rm_file /tmp/$$_clnt_out
}
trap Cleanup EXIT

host=localhost
port=5667

case ${1} in
  Server)
    mkfifo /tmp/$$_srv_in || exit 1
    mkfifo /tmp/$$_srv_out || exit 1
    nc -l ${port} 0<>/tmp/$$_srv_out 1<>/tmp/$$_srv_in &

    while IFS=$'\v' read -ra cline; do  
      : $((cnt++))
      printf "%q " "address@hidden" ; echo ;
      case ${cline[0]} in
        get_env)
          printf "%s\n" "${!cline[1]}" >/tmp/$$_srv_out
          ;;
        *)
          echo "${cnt}" >/tmp/$$_srv_out
          ;;
      esac
    done </tmp/$$_srv_in
    ;;
  Client_ver1)
    mkfifo /tmp/$$_clnt_in || exit 1
    mkfifo /tmp/$$_clnt_out || exit 1
    nc "${host}" ${port} 0<>/tmp/$$_clnt_out 1<>/tmp/$$_clnt_in &
    ask_server(){
        { printf '%s\v' "address@hidden" ; echo ; } >/tmp/$$_clnt_out
        IFS=$'\v' read -ra REPLY </tmp/$$_clnt_in
    }
    for ccmd in cmd1 cmd2 cmd3 ; do
      ask_server "${ccmd}"
      printf '%-15s : %q\n' "${ccmd}" "${REPLY}"
    done
    for ccmd in HOSTNAME USER ; do
      ask_server get_env "${ccmd}"
      printf '%-15s : %q\n' "${ccmd}" "${REPLY}"
    done
    ;;
  Client_ver2)
    exec 3<> /dev/tcp/${host}/${port} || exit
    ask_server(){
        { printf '%s\v' "address@hidden" ; echo ; } >&3
        IFS=$'\v' read -ra REPLY <&3
    }
    for ccmd in cmd1 cmd2 cmd3 ; do
      ask_server "${ccmd}"
      printf '%-15s : %q\n' "${ccmd}" "${REPLY[*]}"
    done
    exec 3>&-
      
    ;;
esac




On Mon, Jun 17, 2013 at 6:59 PM, Greg Wooledge <address@hidden> wrote:
On Mon, Jun 17, 2013 at 04:33:00PM +0000, adrelanos wrote:
> is it possible to do with bi-directional socket client / server
> communication with bash? Is there some example code?

Client only.

exec 3<> /dev/tcp/"$host"/"$port" || exit
IFS= read -r banner <&3
banner=${banner%$'\r'}; echo "Banner: <$banner>"
message='HELO world'
printf '%s\r\n' >&3
IFS= read -r response <&3
response=${response%$'\r'}; echo "Response: <$response>"
... etc. ...
exec 3>&-

If you need server sockets, you'll need to use 3rd party programs, like
tcpserver (from ucspi-tcp), or xinetd/inetd/etc.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]