Aktuelle Zeit: 28.09.2020 19:41

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 45 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: Webserver bzw. Problem mit SendNetworkData()
BeitragVerfasst: 11.02.2020 11:40 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Wie hast du das denn "so" in PB aufgerufen? Wo kommen de Variablen her, die eigentlich Konstanten sein sollten? Und was sind htons() und inet_addr()? Dein Code ist so doch gar nicht lauffähig.

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Webserver bzw. Problem mit SendNetworkData()
BeitragVerfasst: 11.02.2020 14:39 
Offline

Registriert: 28.12.2005 14:26
Wohnort: NRW
Das ist im Prinzip das, was "strace netcat -l 0.0.0.0 80" ausgeworfen hat:
Code:
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(80), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 1)

nur ein bisschen so modifiziert, dass PB es überhaupt schluckt.

Klar, dass das nicht funktionieren kann, aber ich habe leider keine Ahnung, wie ich die geforderten Parameter übergeben kann.

_________________
Gruß
Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Webserver bzw. Problem mit SendNetworkData()
BeitragVerfasst: 11.02.2020 19:13 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Das musst du natürlich alles erst mal übersetzen, sprich die Konstanten und Strukturen zusammensuchen und in Purebasic verügbar machen und dann entsprechend anwenden.
Hier mal ein auf die Schnelle zusammengeschustertes Beispiel, was noch nicht komplett funktioniert.

Es öffnet einen Socket auf Port 8080, zu dem man sich verbinden kann. Sobald die Verbindung steht, sollte eigentlich ein Text gesendet werden, was aber nicht funktioniert. Vielleicht muss man noch TCP_NODELAY setzen, wie hier erwähnt wird: https://stackoverflow.com/a/7400391/4239139
Code:
EnableExplicit

#AF_INET = 2
#SOCK_STREAM = 1
#IPPROTO_TCP = 6

#SOL_SOCKET = 1
#SO_REUSEADDR = 2
#SO_REUSEPORT = 15

Structure in_addr
   s_addr.l
EndStructure

Structure sockaddr_in
   sin_family.w
   sin_port.u
   sin_addr.in_addr
   sin_zero.a[8]
EndStructure

Define.i hSocket = socket_(#AF_INET, #SOCK_STREAM, #IPPROTO_TCP)
If hSocket < 0
   Debug "Error opening socket."
   End
EndIf
Debug "Socket = " + hSocket
Define enable.l = 1
If setsockopt_(hSocket, #SOL_SOCKET, #SO_REUSEADDR, @enable, SizeOf(enable)) < 0
   Debug "Error setting SO_REUSEADDR"
   End
EndIf
If setsockopt_(hSocket, #SOL_SOCKET, #SO_REUSEPORT, @enable, SizeOf(enable)) < 0
   Debug "Error setting SO_REUSEPORT"
   End
EndIf

Define serverInfo.sockaddr_in
serverInfo\sin_family = #AF_INET
serverInfo\sin_port = htons_(8080)
inet_aton_("0.0.0.0", @serverInfo\sin_addr)

If bind_(hSocket, @serverInfo, SizeOf(serverInfo)) < 0
   Debug "Error binding socket."
   End
EndIf

If listen_(hSocket, 1) < 0
   Debug "Error listening on socket."
   End
EndIf

Define clientSocket.sockaddr_in
Define newConnection.i = accept_(hSocket, @clientSocket, SizeOf(clientSocket))
If newConnection < 0
   Debug "Error accepting incoming connection."
   End
EndIf

Define *utf8Text = UTF8("Hello World")
send_(newConnection, *utf8Text, MemorySize(*utf8Text), 0)
FreeMemory(*utf8Text)

Delay(1000)

close_(newConnection)
close_(hSocket)

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Webserver bzw. Problem mit SendNetworkData()
BeitragVerfasst: 12.02.2020 14:59 
Offline

Registriert: 28.12.2005 14:26
Wohnort: NRW
Vielen Dank für Deine Mühe NicTheQuick,

aber ich fürchte, das krieg ich nicht hin.

Man müsste dann ja auch irgendwie mit den PB-Netzwerkbefehlen darauf zugreifen können (NetworkServerEvent(), EventClient(), ReceiveNetworkData(), SendNetworkData() etc.).

Wäre es nicht sinnvoller Fred einmal auf diesen gravierenden Bug hinzuweisen, der ja eigentlich schon seit über zehn Jahren bekannt ist, wie ich hier gesehen habe: https://www.purebasic.fr/german/viewtopic.php?f=3&t=19047&hilit=setsockopt

_________________
Gruß
Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Webserver bzw. Problem mit SendNetworkData()
BeitragVerfasst: 12.02.2020 17:07 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Also wenn ich das richtig sehe, dann kann man aus dem Handle von CreateNetworkServer() die Socket-Nummer extrahieren und direkt nutzen. Voraussetzung ist, dass man #PB_Any nutzt.
Ich habe dir mal etwas vorbereitet. Im Grunde musst du nur das große CompilerIf oben in deinen schon vorhandenen Code stecken und den Rest kannst du so lassen wie er bisher war.
Code:
EnableExplicit

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
   #SOL_SOCKET = 1
   #SO_REUSEADDR = 2
   #SO_REUSEPORT = 15
   
   Procedure CreateNetworkServerEx(ServerID.i, Port.i, Modus, BindedIP$)
      Protected handle.i
      If ServerID.i = #PB_Any
         handle.i = CreateNetworkServer(#PB_Any, Port, Modus, BindedIP$)
         If Not handle
            ProcedureReturn handle
         EndIf
         Protected hSocket.l = PeekL(handle), enable.l = 1
         If setsockopt_(hSocket, #SOL_SOCKET, #SO_REUSEADDR, @enable, SizeOf(enable)) < 0
            Debug "Error setting SO_REUSEADDR"
            End
         EndIf
         If setsockopt_(hSocket, #SOL_SOCKET, #SO_REUSEPORT, @enable, SizeOf(enable)) < 0
            Debug "Error setting SO_REUSEPORT"
            End
         EndIf
         ProcedureReturn handle
      Else
         ProcedureReturn CreateNetworkServer(ServerID, Port, Modus, BindedIP$)
      EndIf
   EndProcedure
   Macro CreateNetworkServer(a, b, c = #PB_Network_TCP | #PB_Network_IPv4, d = "0.0.0.0")
      CreateNetworkServerEx(a, b, c, d)
   EndMacro
CompilerEndIf

InitNetwork()
Define a.i = CreateNetworkServer(#PB_Any, 8080, #PB_Network_TCP, "0.0.0.0")

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Webserver bzw. Problem mit SendNetworkData()
BeitragVerfasst: 12.02.2020 18:56 
Offline

Registriert: 28.12.2005 14:26
Wohnort: NRW
Wahnsinn, das funktioniert!

Der Port ist sofort wieder frei.

Tausend Dank NicTheQuick

Du bist ja so was von genial!!!

Kann's noch garnicht fassen.

_________________
Gruß
Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Webserver bzw. Problem mit SendNetworkData()
BeitragVerfasst: 12.02.2020 23:26 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Gimbly hat geschrieben:
Wahnsinn, das funktioniert!

Der Port ist sofort wieder frei.

Freut mich. <)
Zitat:
Tausend Dank NicTheQuick

Du bist ja so was von genial!!!

Übertreib nicht so viel. :wink:

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Webserver bzw. Problem mit SendNetworkData()
BeitragVerfasst: 13.02.2020 20:50 
Offline

Registriert: 28.12.2005 14:26
Wohnort: NRW
Leider zu früh gefreut. :cry:

Hatte nicht richtig getestet.

Sobald es einen Request gab, bleibt der Port nach Beenden wie gehabt 60 Sekunden lang gesperrt.

_________________
Gruß
Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Webserver bzw. Problem mit SendNetworkData()
BeitragVerfasst: 14.02.2020 11:11 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Erklär mal bitte genau die Reihenfolge und die Dinge, die du machst, dass es 60 Sekunden lang nicht mehr geht.

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Webserver bzw. Problem mit SendNetworkData()
BeitragVerfasst: 14.02.2020 11:56 
Offline

Registriert: 28.12.2005 14:26
Wohnort: NRW
Also Du startest den Atomic-Webserver und machst dann über den Browser einen Request: localhost:8080.

Es kommt ordnungsgemäß die Index.html.

Wenn Du dann irgendwann den Webserver beendest, ist ab dann etwa 60 Sek. lang der Port 8080 gesperrt. Erst dann kannst Du den Webserver wieder starten.

Wenn Du den Webserver allerdings beendest, ohne dass während seiner Laufzeit ein Request stattgefunden hat, ist der Port 8080 sofort frei und Du kannst ihn sofort neu starten.

_________________
Gruß
Markus


Zuletzt geändert von Gimbly am 14.02.2020 14:08, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 45 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye