Serveur et client UDP Toy dans Go. J'ai fait cela pour me familiariser avec le package standard de Go net
, en particulier les fonctions liées à UDP.
Parce que j'ai appris en écrivant, voici une étrange inadéquation stylistique entre la façon dont server.go gère les sockets UDP et la façon dont client.go fait des choses "générales" en matière de socket. Pour concilier cette inadéquation, j'ai créé client2.go avec uniquement des fonctions UDP pour correspondre à server.go.
J'ai également ajouté un client Python 3, car je n'ai nulle part où le mettre.
Le serveur écoute les paquets UDP sur un numéro de port particulier. Il bloque l’appel de méthode net.ReadFromUDP()
.
Si le serveur reçoit des octets, il affiche le nombre d'octets qu'il a reçus d'où, puis réécrit ce même nombre d'octets là où il les a reçus.
Le client crée une connexion UDP vers une adresse IP (v4 ou v6) ou un nom d'hôte et un numéro de port, en fonction des informations de ligne de commande. Ensuite, il écrit les octets d'une chaîne, également à partir de la ligne de commande, sur la connexion UDP. Il attend que certains octets lui reviennent ou qu'une erreur se produise. Alors ça existe.
Simple et pourtant plein de problèmes. Pas de délai d'attente, pas de nombre défini d'octets. Le client ou le serveur peut rester indéfiniment en attente d'un paquet qui n'arrive jamais.
$ go build server.go
$ go build client.go
$ go build client2.go
Le client python 3 est interprété et n'a pas besoin de "construction".
Dans la fenêtre 1 :
$ ./server :: 7890
Accepting a new packet
Dans la fenêtre 2 :
$ ./client udp localhost 7890 'some string'
Ou:
$ ./client2 fe80::a11:96ff:fe7f:6d74 7890 'some string' [eth0]
Ou:
$ ./client1.py localhost 7890 'some string'
Le dernier argument de ./client2
est facultatif. C'est le nom de l'interface réseau via laquelle acheminer les paquets. Notez le contenu de net.UDPAddr
:
type UDPAddr struct {
IP IP
Port int
Zone string // IPv6 scoped addressing zone
}
L'élément Zone est utilisé pour le routage des adresses lien-local (fe80 : préfixe). Le nom de l'interface fonctionne comme la zone. Appelé avec un 4ème argument, client2
utilise cet argument comme "zone".