Ho scritto un semplice server UDP in go.Strano comportamento del server UDP golang
Quando faccio go run udp.go
stampa tutti i pacchetti che invio a esso. Ma quando si esegue go run udp.go > out
si ferma passando stdout
al file out
quando il client si interrompe.
Il client è un programma semplice che invia 10k richieste. Quindi nel file ho circa il 50% dei pacchetti inviati. Quando eseguo di nuovo il client, il file out
si espande nuovamente fino al termine dello script client.
codice del server:
package main
import (
"net"
"fmt"
)
func main() {
addr, _ := net.ResolveUDPAddr("udp", ":2000")
sock, _ := net.ListenUDP("udp", addr)
i := 0
for {
i++
buf := make([]byte, 1024)
rlen, _, err := sock.ReadFromUDP(buf)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(buf[0:rlen]))
fmt.Println(i)
//go handlePacket(buf, rlen)
}
}
Ed ecco il codice del client:
package main
import (
"net"
"fmt"
)
func main() {
num := 0
for i := 0; i < 100; i++ {
for j := 0; j < 100; j++ {
num++
con, _ := net.Dial("udp", "127.0.0.1:2000")
fmt.Println(num)
buf := []byte("bla bla bla I am the packet")
_, err := con.Write(buf)
if err != nil {
fmt.Println(err)
}
}
}
}
Stai ignorando diversi possibili errori, sia nel client che nel server. Durante l'esecuzione del client, ha immediatamente generato un errore di runtime. Dopo aver aggiunto un controllo di errore: "dial udp 127.0.0.1:2000: troppi file aperti". Se non sai se il tuo problema è relativo, ma ti chiederei di aggiungere controlli per tutti i possibili errori, e se questo non ti porta alla soluzione del tuo problema, torna qui con i risultati :) – fresskoma
I aggiunto controllo degli errori e non avere tali problemi. Il client funziona, l'ho provato con un altro server. Sembra che il reindirizzamento faccia ritardare la lettura su socket e che alcuni pacchetti manchino ... –