Seite 2 von 5

Re: Webserver bzw. Problem mit SendNetworkData()

Verfasst: 29.12.2019 18:20
von Gimbly
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.

Re: Webserver bzw. Problem mit SendNetworkData()

Verfasst: 29.12.2019 18:28
von #NULL
Müssen da vielleicht noch network events abgearbeitet werden damit die Close..() auch gemacht werden?

Re: Webserver bzw. Problem mit SendNetworkData()

Verfasst: 31.12.2019 16:00
von Gimbly
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.

Re: Webserver bzw. Problem mit SendNetworkData()

Verfasst: 31.12.2019 16:14
von mk-soft
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.

Re: Webserver bzw. Problem mit SendNetworkData()

Verfasst: 31.12.2019 17:55
von NicTheQuick
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:

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)
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. :freak:

Re: Webserver bzw. Problem mit SendNetworkData()

Verfasst: 31.12.2019 18:51
von Gimbly
Hallo NicTheQuick,

gibt's irgendeine Möglichkeit, diese Flags zu setzen?

Das wäre echt super!

Re: Webserver bzw. Problem mit SendNetworkData()

Verfasst: 08.02.2020 19:27
von Gimbly
Also verstehe ich das jetzt richtig: es gibt keine Möglichkeit diese Flags per Purebasic zu setzen?

Re: Webserver bzw. Problem mit SendNetworkData()

Verfasst: 08.02.2020 20:56
von Gimbly
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)

Re: Webserver bzw. Problem mit SendNetworkData()

Verfasst: 09.02.2020 15:05
von NicTheQuick
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()

Verfasst: 10.02.2020 20:55
von Gimbly
Wenn ich das in PB so aufrufe:

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)
kommt laut strace das dabei raus:

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)
Was müsste man es richtig machen?