Webserver bzw. Problem mit SendNetworkData()

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Re: Webserver bzw. Problem mit SendNetworkData()

Beitrag 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.
Gruß
Markus
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Webserver bzw. Problem mit SendNetworkData()

Beitrag von #NULL »

Müssen da vielleicht noch network events abgearbeitet werden damit die Close..() auch gemacht werden?
my pb stuff..
Bild..jedenfalls war das mal so.
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Re: Webserver bzw. Problem mit SendNetworkData()

Beitrag 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.
Gruß
Markus
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Webserver bzw. Problem mit SendNetworkData()

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
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()

Beitrag 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:
Bild
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Re: Webserver bzw. Problem mit SendNetworkData()

Beitrag von Gimbly »

Hallo NicTheQuick,

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

Das wäre echt super!
Gruß
Markus
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Re: Webserver bzw. Problem mit SendNetworkData()

Beitrag von Gimbly »

Also verstehe ich das jetzt richtig: es gibt keine Möglichkeit diese Flags per Purebasic zu setzen?
Gruß
Markus
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Re: Webserver bzw. Problem mit SendNetworkData()

Beitrag 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)
Gruß
Markus
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
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()

Beitrag 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ß.
Bild
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Re: Webserver bzw. Problem mit SendNetworkData()

Beitrag 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?
Gruß
Markus
Antworten