Seltsames Verhalten von golang UDP-server
Schrieb ich einen einfachen UDP-server gehen.
Wenn ich go run udp.go
druckt er alle Pakete, die ich senden, um es. Aber beim laufen go run udp.go > out
hört es vorbei stdout
zu den out
- Datei, wenn der client beendet.
Client ist einfaches Programm, das sendet 10k Anfragen. Also in der Datei habe ich rund 50% der gesendeten Pakete. Wenn ich den client wieder, der out
Datei wächst wieder, bis das client-Skript abgeschlossen ist.
Server-code:
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)
}
}
Und hier ist der client-code:
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)
}
}
}
}
- Sie ignorieren mehrere mögliche Fehler, sowohl in der client-und der server. Wenn Sie mit Ihrem client, wird es sofort warf einen runtime error. Nach dem hinzufügen einer Fehler-check: "wählen Sie udp 127.0.0.1:2000: too many open files". Wenn Sie nicht wissen, ob das problem relevant ist, aber ich würde Sie bitten, hinzufügen, prüft alle möglichen Fehler, und wenn das nicht dazu führen, dass Sie die Lösung für Ihr problem, wieder hierher kommen, mit den Ergebnissen 🙂
- Ich fügte hinzu, Fehler überprüfen und haben keine solchen Probleme. Client funktioniert, getestet habe ich es mit einem anderen server. Es sieht so aus, Umleitung macht lag bei der Lektüre auf-Buchse, und einige Pakete fehlen....
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Sie vermutet, wie es scheint, UDP packet loss aufgrund der Natur von UDP. Da UDP verbindungslos, client kümmert sich nicht, wenn der server verfügbar ist oder bereit, Daten zu empfangen. Also, wenn der server ausgelastet ist die Verarbeitung, es wird nicht verfügbar sein zu handhaben, die nächste eingehende Datagramm. Sie können prüfen, mit
netstat -u
(die sollte auch UDP packet loss info). Ich lief in das gleiche Ding, in welchem der server (Seite erhalten) konnte nicht Schritt halten mit der gesendeten Pakete.Können Sie versuchen, zwei Dinge (der zweite war für mich bei deinem Beispiel):
Nennen SetReadBuffer. Sicherstellung der sockel erhalten hat genügend Pufferung zu behandeln alles, was Sie werfen es an.
Tun alle Paket-Verarbeitung in einem go-routine. Erhöhen Sie die Datagramme pro Sekunde, indem Sie den server nicht beschäftigt mit anderen arbeiten, wenn Sie wollen, es zu empfangen. also Verschieben Sie die Bearbeitung zu einem go-routine,, so dass Sie nicht halten bis ReadFromUDP().
...
Eine Letzte option:
Schließlich, und wahrscheinlich nicht das, was Sie wollen, Sie setzen Sie einen Schlaf in Ihrem client, die verlangsamen würde die rate und die würde auch das problem entfernen. z.B.
Versuchen Sie, die Synchronisierung von stdout nach dem write-Anweisungen.
exit
. Siehe die Manpage. "Der stream stdout ist line-buffered, wenn es Punkte auf einem terminal. Unvollständige Zeilen werden nicht angezeigt, bis fflush(3) oder exit(3) aufgerufen wird, oder eine neue Zeile gedruckt."