Sockets réseaux
Une seule connexion possible. Ensuite, disparait.
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
- domain socket vs tcp socket
- code client/serveur simple (unix domain socket)
- code client/serveur complet
- fork
- socket et fichier
- sur la même machine :
- parent/enfant issu de fork. Comme copie les file descriptor, ce sont les mêmes et on peut utiliser des pipe https://stackoverflow.com/questions/14170647/fork-parent-child-communication
- unix domain socket
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 127.0.0.1
Client (dans un autre terminal) :
nc 127.0.0.1 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 tcp-listen:9090,fork,reuseaddr \
'system:
echo "Le serveur écoute."
while read CLIENT_MESSAGE; do
echo "le serveur répond : $CLIENT_MESSAGE"
done
'
outil de connexion
echo serveur
#! /bin/sh
if [ -z "$1" ]; then
PORT=9090
else
PORT=$1
fi
socat tcp-listen:$PORT,fork,reuseaddr \
'system:
echo "Le serveur écoute."
while read CLIENT_MESSAGE; do
echo "le serveur répond : $CLIENT_MESSAGE"
done
'
mono ligne
PORT=9090; socat tcp-listen:$PORT,fork,reuseaddr 'system: while read CLIENT_MESSAGE; do echo "le serveur répond : $CLIENT_MESSAGE"; done'
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=$(echo $PIPE | sed 's:/tmp/pns_::')
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
- web minimal
- https://fabianlee.org/2022/10/26/linux-socat-used-as-secure-https-web-server/
- https://stuff.mit.edu/afs/sipb/machine/penguin-lust/src/socat-1.7.1.2/EXAMPLES
bibliographie
- Linux Networking-concepts HOWTO
- Beej's Guide to Network Programming Using Internet Sockets
- https://opensource.com/article/19/4/interprocess-communication-linux-networking
client serveur
- socat : un serveur en shell qui répond à un protocole simple :
- répond hello à
hello
- donne l'heure
- envoie un fichier s'il existe
- répond hello à
- node/express, flask, fastAPI :
- route index.html redirection vers /static/index.html
- une route qui calcule une somme
- un site static simple
- un js dedans qui appelle la fonction à calculer avec un /api/calcul
- deux route en hop. Ramener le port 9090 de roucas sur localhost en suivant la route : localhost <-> ovh <-> sas1 <-> roucas101.
- https://github.com/denehs/unix-domain-socket-example/blob/master/client.c
- tcp socket
- https://www.tala-informatique.fr/wiki/index.php/C_socket
- ntp client
- iphone firewall
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 :
- shell
- python seul
- python + flask + virtualenv
- node seul
- node + express + package.json