Mit nodejs kann ich UDP-Pakete mit einer Nutzlast von 50.000 Zeichen übertragen. Mit socat gelingt mir das jedoch nicht (Linux Ubuntu 20.04 auf dem Client und dem Server).
Für diesen Test habe ich ein VPN verwendet, das meinen Heim-Host mit meinem Arbeits-Host verbindet. Ich hatte mit einem gewissen Datenverlust bei Socat gerechnet, aber nicht in diesem Ausmaß!
Auf dem Remote-Host (Arbeits-Host) wartet ein Socat-Server auf eine Anforderung, eine aufgeblähte UDP-Antwort > 50.000 Bytes zurückzusenden.
cat <<EOF > sotest.sh
#!/bin/bash
head -c 50000 < /dev/zero | tr '\0' 'q'
EOF
chmod +x sotest.sh
socat udp4-listen:13000,reuseaddr,fork EXEC:"./sotest.sh" # server
#client
printf "trigger" |socat -T 5 -,ignoreeof udp4:10.50.1.184:13000,sndbuf=64000,rcvbuf=64000 > t.t
Und wenn ich die Nachrichtengröße überprüfe, wc -c t.t
erhalte ich etwa 8.000 Zeichen statt 50.000.
Wenn ich meinen Node.js-UDP-Client/-Server verwende, wird die vom Server gesendete 50.000-Zeichen-Nachricht vollständig vom Node.js-Client empfangen. Client:https://jsfiddle.net/xtcpL63a/ Server:https://jsfiddle.net/851fc7bp/
Der einzige Hinweis, den ich habe, ist die Fehlermeldung mit socat, die nur im Debug-Modus angezeigt wird
022/12/03 22:37:40 socat[1051733] N forked off child process 1051734
2022/12/03 22:37:40 socat[1051733] N forked off child process 1051734
2022/12/03 22:37:40 socat[1051733] I close(7)
2022/12/03 22:37:40 socat[1051733] I resolved and opened all sock addresses
2022/12/03 22:37:40 socat[1051733] N starting data transfer loop with FDs [5,5] and [6,6]
2022/12/03 22:37:40 socat[1051733] I transferred 73 bytes from 5 to 6
2022/12/03 22:37:40 socat[1051734] I just born: child process 1051734
2022/12/03 22:37:40 socat[1051734] I close(4)
2022/12/03 22:37:40 socat[1051734] I close(3)
2022/12/03 22:37:40 socat[1051734] I close(6)
2022/12/03 22:37:40 socat[1051734] I dup2(7, 0) -> 0
2022/12/03 22:37:40 socat[1051734] I dup2(7, 1) -> 1
2022/12/03 22:37:40 socat[1051734] I close(7)
2022/12/03 22:37:40 socat[1051734] N execvp'ing "./sotest.sh"
2022/12/03 22:37:40 socat[1051733] I transferred 8192 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] I transferred 8192 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] I transferred 8192 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] I transferred 8192 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] I transferred 8192 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] I transferred 8192 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] I transferred 848 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] E read(5, 0x5566b4417150, 8192): Connection refused
2022/12/03 22:37:40 socat[1051733] N exit(1)
2022/12/03 22:37:40 socat[1051733] I shutdown(5, 2)
2022/12/03 22:37:40 socat[1051733] I shutdown(6, 2)
Dieses Problem kann weder mit dem Puffer auf Linux-Seite zusammenhängen, noch kann es mit MTU zusammenhängen. Was passiert also mit Socat?
Lösung: Tero Kilkanen hat auf das Problem hingewiesen. Indem ich Socat zwang, größere Puffer auf der Clientseite zu verwenden, konnte ich die Nachricht vollständig empfangen. Das löst das Problem, erklärt es aber nicht wirklich ...
#client
printf "${MSG}" |socat -b100000 -T 5 -,ignoreeof udp4:10.50.1.184:13000,sndbuf=64000,rcvbuf=64000 > t.t
Auf der Serverseite wurde sichergestellt, dass ein Paket gesendet wurde. Sie können den Unterschied im Verhalten in den Debug-Protokollen sehen:
socat -b100000 -d -d -d udp4-listen:13000,reuseaddr,fork EXEC:"./sotest.sh"
Antwort1
socat
Die Standardpuffergröße beträgt 8 KB. Sie legen die Puffergröße nur auf der Clientseite fest. Daher verwendet der Server die Standardpuffergröße von 8 KB. Aus diesem Grund werden die Pakete in 8 KB UDP-Datagrammen gesendet.
Aus irgendeinem Grund liest der Client dann nur das erste vom Server gesendete UDP-Datagramm.