Servidor y cliente UDP de juguete en Go. Hice esto para familiarizarme con el paquete estándar net
de Go, específicamente las funciones relacionadas con UDP.
Debido a que aprendí mientras escribía, aquí hay una extraña discrepancia estilística entre cómo server.go hace sockets UDP y cómo client.go hace algunas cosas de socket "generales". Para conciliar esta discrepancia, hice client2.go solo con funciones UDP para que coincidieran con server.go.
También agregué un cliente Python 3 porque no tengo otro lugar donde colocarlo.
El servidor escucha paquetes UDP en un número de puerto particular. Bloquea la llamada al método net.ReadFromUDP()
.
Si el servidor alguna vez recibe bytes, imprime cuántos bytes recibió de dónde y luego escribe esa misma cantidad de bytes en el lugar de donde los recibió.
El cliente crea una conexión UDP a alguna IP (v4 o v6) o nombre de host y un número de puerto, según la información de la línea de comando. Luego escribe bytes de una cadena, también desde la línea de comando, en la conexión UDP. Espera hasta que regresen algunos bytes o se produzca un error. Entonces existe.
Sencillo y, sin embargo, lleno de problemas. Sin tiempos de espera, sin un número establecido de bytes. El cliente o el servidor podrían colgarse para siempre esperando un paquete que nunca llega.
$ go build server.go
$ go build client.go
$ go build client2.go
El cliente Python 3 se interpreta y no necesita "construcción".
En la ventana 1:
$ ./server :: 7890
Accepting a new packet
En la ventana 2:
$ ./client udp localhost 7890 'some string'
O:
$ ./client2 fe80::a11:96ff:fe7f:6d74 7890 'some string' [eth0]
O:
$ ./client1.py localhost 7890 'some string'
El argumento final de ./client2
es opcional. Es el nombre de la interfaz de red a través de la cual se enrutan los paquetes. Tenga en cuenta el contenido de net.UDPAddr
:
type UDPAddr struct {
IP IP
Port int
Zone string // IPv6 scoped addressing zone
}
El elemento Zone se utiliza para enrutar direcciones de enlace local (fe80: prefijo). El nombre de la interfaz funciona como la zona. Llamado con un cuarto argumento, client2
usa ese argumento como la "zona".