Sockets réseaux

Une seule connexion possible. Ensuite, disparaît.

TBD Faire en shell avec nc TBD Faire en C :

  • client time ?
  • client serveur

TBD limité à 1 connection. En avoir plusieurs possible avec un fork. Le faire

Connexion internet

socket Client / serveur

la commande nc permet d'établir une connexion TCP à un serveur ou de créer un serveur.

Serveur :

nc -l -p 9090 localhost

Sous mac (seulement ?):

nc -l localhost 9090

Toujours une connexion, mais reste actif après la fermeture :

echo "coucou" | nc -k -l localhost 9090

Client (dans un autre terminal) :

nc localhost 9090

Les stdin/out sont liés.

Nc n'admet qu'une connexion. Pour créer un serveur acceptant plusieurs client, il faut utiliser une autre commande : socat :

#! /bin/sh

socat tcp6-listen:9090,fork,reuseaddr \
'system:

echo "Le serveur écoute."

while read CLIENT_MESSAGE; do
  echo "le serveur répond : $CLIENT_MESSAGE"
done
'

TBD faire un rot13 : tr 'A-Za-z' 'N-ZA-Mn-za-m'

outil de connexion

echo serveur

#! /bin/sh

if [ -z "$1" ]; then 
    PORT=9090
else
    PORT=$1
fi

socat tcp6-listen:$PORT,fork,reuseaddr \
'system:

echo "Le serveur écoute."

while read CLIENT_MESSAGE; do
  echo "le serveur répond : $CLIENT_MESSAGE"
done
'

Ou en utilisant des substitutions :

#! /bin/sh

PORT=${1:-9090}

socat tcp6-listen:$PORT,fork,reuseaddr \
'system:

echo "Le serveur écoute."

while read CLIENT_MESSAGE; do
  echo "le serveur répond : $CLIENT_MESSAGE"
done
'

mono ligne

socat tcp6-listen:9090,fork,reuseaddr 'system: while read CLIENT_MESSAGE; do echo "le serveur répond : $CLIENT_MESSAGE"; done'

Ou encore :

PORT=9090 sh -c "socat tcp6-listen:$PORT,fork,reuseaddr 'system: while read CLIENT_MESSAGE; do echo \"le serveur répond : $CLIENT_MESSAGE\"; done'"

Notez que le sh est obligatoire car la variable est placé dans le process exécutant socat par pour les options qui est encore dans le shell courant.

echo à tous serveur

#! /bin/sh

rm /tmp/pns_* 2>/dev/null

if [ -z "$1" ]; then
    PORT=9090
else
    PORT=$1
fi

socat tcp-listen:$PORT,fork,reuseaddr \
'system:

PIPE=$(mktemp -u /tmp/pns_XXX)
ME=$(printf "%s" "$PIPE" | tail -c 3)
mkfifo $PIPE
while read PIPE_MESSAGE<$PIPE; do
  echo $PIPE_MESSAGE
done &
PID=$!

echo "je suis : $ME"
for EACH_PIPE in $(ls /tmp/pns_*); do
   [ $PIPE != $EACH_PIPE ] &&  echo "$ME est connecté" > $EACH_PIPE
done

while read CLIENT_MESSAGE; do
  for EACH_PIPE in $(ls /tmp/pns_*); do
    echo "Message de $ME : $CLIENT_MESSAGE" > $EACH_PIPE
  done
done
kill $PID
rm $PIPE
'

client

Avec socat :

socat - TCP4:localhost:9090

Avec nc :

nc localhost 9090

web server avec python/socat

python -m http.serveur 8080

TBD en écrire un.

https://dev.to/leandronsp/building-a-web-server-in-bash-part-ii-parsing-http-14kg

https://fazlearefin.blogspot.com/2021/05/http-and-https-simple-web-server-using.html

bibliographie

client serveur

  1. socat : un serveur en shell qui répond à un protocole simple :
    1. répond hello à hello
    2. donne l'heure
    3. envoie un fichier s'il existe
  2. node/express, flask, fastAPI :
    1. route index.html redirection vers /static/index.html
    2. une route qui calcule une somme
    3. un site static simple
    4. un js dedans qui appelle la fonction à calculer avec un /api/calcul
  3. deux route en hop. Ramener le port 9090 de roucas sur localhost en suivant la route : localhost <-> ovh <-> sas1 <-> roucas101.

tbd

en python : https://www.youtube.com/watch?v=Ftg8fjY_YWU

https://www.geeksforgeeks.org/how-to-kill-a-detached-screen-session-in-linux/

cours web

remplacer screen par tmux.

Utiliser un shell que l'on sauve. Comme ça on peut y revenir, par exemple si virtualenv.

faire un exemple complet avec virtualenv

faire plusieurs petits serveurs avec :