Webserver bzw. Problem mit SendNetworkData()
Re: Webserver bzw. Problem mit SendNetworkData()
Hab mal etwas experimentiert, mit folgendem Ergebnis:
Immer wenn der Server gestartet wurde und keinerlei Anfragen gestellt wurden, ist der Port nach Strg-C sofort wieder frei, auch ohne CloseNetworkConnection() und CloseNetworkServer().
Sobald eine Anfrage (GET) gestellt wurde ist nach direkt danach erfolgtem Strg-C auch mit vorherigem CloseNetworkConnection(ClientID) und CloseNetworkServer(0) der Port erstmal eine Zeit blockiert.
Immer wenn der Server gestartet wurde und keinerlei Anfragen gestellt wurden, ist der Port nach Strg-C sofort wieder frei, auch ohne CloseNetworkConnection() und CloseNetworkServer().
Sobald eine Anfrage (GET) gestellt wurde ist nach direkt danach erfolgtem Strg-C auch mit vorherigem CloseNetworkConnection(ClientID) und CloseNetworkServer(0) der Port erstmal eine Zeit blockiert.
Gruß
Markus
Markus
Re: Webserver bzw. Problem mit SendNetworkData()
Müssen da vielleicht noch network events abgearbeitet werden damit die Close..() auch gemacht werden?
Re: Webserver bzw. Problem mit SendNetworkData()
Folgendes Verhalten tritt unter Linux zuverlässig reproduzierbar auf:
Egal ob mit oder ohne CloseNetworkConnection(ClientID) und CloseNetworkServer(0) sowie vorigem Abarbeiten aller network events: Wenn mindestens eine Anfrage an den Server gestellt wurde,
ist der Port 80 nach Beenden des Servers für ziemlich genau 60 Sekunden blockiert (die 60 Sekunden zählen ab Beenden, nicht ab der letzten Anfrage).
Solange kann er dann nicht neu gestartet werden (alles nur unter Linux, unter Windows ist der Port immer sofort wieder frei).
Wurde der Server dagegen beendet ohne dass zuvor eine Anfrage gestellt wurde, ist der Port sofort wieder frei und der Server kann umgehend neu gestartet werden.
Für mich ist das deswegen so frustrierend, weil ich die Idee hatte, den Server von einem anderen Prozess aus zu starten, zu überwachen ob er noch ordnungsgemäß läuft und im Bedarfsfall sofort wieder neu zu starten. Das scheint nur mit 60 Sekunden Wartezeit zu gehen.
Egal ob mit oder ohne CloseNetworkConnection(ClientID) und CloseNetworkServer(0) sowie vorigem Abarbeiten aller network events: Wenn mindestens eine Anfrage an den Server gestellt wurde,
ist der Port 80 nach Beenden des Servers für ziemlich genau 60 Sekunden blockiert (die 60 Sekunden zählen ab Beenden, nicht ab der letzten Anfrage).
Solange kann er dann nicht neu gestartet werden (alles nur unter Linux, unter Windows ist der Port immer sofort wieder frei).
Wurde der Server dagegen beendet ohne dass zuvor eine Anfrage gestellt wurde, ist der Port sofort wieder frei und der Server kann umgehend neu gestartet werden.
Für mich ist das deswegen so frustrierend, weil ich die Idee hatte, den Server von einem anderen Prozess aus zu starten, zu überwachen ob er noch ordnungsgemäß läuft und im Bedarfsfall sofort wieder neu zu starten. Das scheint nur mit 60 Sekunden Wartezeit zu gehen.
Gruß
Markus
Markus
Re: Webserver bzw. Problem mit SendNetworkData()
Ist unter macOS (Unix basiert) auch so...
Also 60 Sekunden warten und dann noch einmal probieren bis es klappt, oder abbrechen nach Anzahl von versuchen.
Also 60 Sekunden warten und dann noch einmal probieren bis es klappt, oder abbrechen nach Anzahl von versuchen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Webserver bzw. Problem mit SendNetworkData()
Das Problem ist nicht Linux/Unix, sondern die Implementierung der Netzwerkfunktionen von Purebasic. Es sollte die setsockopt-Funktion aufrufen um die Flags SO_REUSEADDR und SO_REUSEPORT für den Socket zu setzen. Wenn man sich die Systemcalls von netcat anschaut, sieht man die da auch:
Purebasic macht nichts mit setsockopt, deswegen kann man nicht direkt wiederverbinden.
Mit netcat kann man immer wieder starten, sich verbinden, stoppen, starten, sich verbinden, usw. ohne dass man eine Fehlermeldung bekommt.
Edit: Hab aus Versehen zuerst auf Englisch geschrieben.
Code: Alles auswählen
$ strace netcat -l 0.0.0.0 12345
…
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
setsockopt(3, SOL_SOCKET, SO_REUSEPORT, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(12345), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 1)
Mit netcat kann man immer wieder starten, sich verbinden, stoppen, starten, sich verbinden, usw. ohne dass man eine Fehlermeldung bekommt.
Edit: Hab aus Versehen zuerst auf Englisch geschrieben.
Re: Webserver bzw. Problem mit SendNetworkData()
Hallo NicTheQuick,
gibt's irgendeine Möglichkeit, diese Flags zu setzen?
Das wäre echt super!
gibt's irgendeine Möglichkeit, diese Flags zu setzen?
Das wäre echt super!
Gruß
Markus
Markus
Re: Webserver bzw. Problem mit SendNetworkData()
Also verstehe ich das jetzt richtig: es gibt keine Möglichkeit diese Flags per Purebasic zu setzen?
Gruß
Markus
Markus
Re: Webserver bzw. Problem mit SendNetworkData()
Könnte man nicht statt "CreateNetworkServer(0, 80)"
sowas in der Art machen:
socket_(AF_INET, SOCK_STREAM, IPPROTO_IP)
setsockopt_(3, SOL_SOCKET, SO_REUSEADDR, [1], 4)
setsockopt_(3, SOL_SOCKET, SO_REUSEPORT, [1], 4)
bind_(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("0.0.0.0")}, 16)
listen_(3, 1)
? (Jetzt mal ganz naiv gedacht)
sowas in der Art machen:
socket_(AF_INET, SOCK_STREAM, IPPROTO_IP)
setsockopt_(3, SOL_SOCKET, SO_REUSEADDR, [1], 4)
setsockopt_(3, SOL_SOCKET, SO_REUSEPORT, [1], 4)
bind_(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("0.0.0.0")}, 16)
listen_(3, 1)
? (Jetzt mal ganz naiv gedacht)
Gruß
Markus
Markus
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Webserver bzw. Problem mit SendNetworkData()
Ja, du kannst natürlich direkt die Linux-Funktionen dafür nutzen, aber dann musst du alles mit ihnen machen, dann gehen die Purebasic-Funktionen nicht mehr. Vielleicht gibt es aber auch einen Zwischenweg, genau kann ich dir das nicht sagen, weil ich es auch nicht besser weiß.
Re: Webserver bzw. Problem mit SendNetworkData()
Wenn ich das in PB so aufrufe:
kommt laut strace das dabei raus:
Was müsste man es richtig machen?
Code: Alles auswählen
socket_(AF_INET, SOCK_STREAM, IPPROTO_IP)
setsockopt_(3, SOL_SOCKET, SO_REUSEADDR, 0, 4)
setsockopt_(3, SOL_SOCKET, SO_REUSEPORT, 0, 4)
bind_(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("0.0.0.0")}, 16)
listen_(3, 1)
Code: Alles auswählen
socket(AF_UNSPEC, 0, 0) = -1 EAFNOSUPPORT (Address family not supported by protocol)
setsockopt(3, SOL_IP, 0 /* IP_??? */, NULL, 4) = -1 EBADF (Bad file descriptor)
setsockopt(3, SOL_IP, 0 /* IP_??? */, NULL, 4) = -1 EBADF (Bad file descriptor)
bind(3, NULL, 16) = -1 EBADF (Bad file descriptor)
listen(3, 1) = -1 EBADF (Bad file descriptor)
Gruß
Markus
Markus