PureBoard http://forums.purebasic.com/german/ |
|
Webserver bzw. Problem mit SendNetworkData() http://forums.purebasic.com/german/viewtopic.php?f=21&t=31786 |
Seite 3 von 5 |
Autor: | NicTheQuick [ 11.02.2020 11:40 ] |
Betreff des Beitrags: | Re: Webserver bzw. Problem mit SendNetworkData() |
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. |
Autor: | Gimbly [ 11.02.2020 14:39 ] |
Betreff des Beitrags: | Re: Webserver bzw. Problem mit SendNetworkData() |
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. |
Autor: | NicTheQuick [ 11.02.2020 19:13 ] |
Betreff des Beitrags: | Re: Webserver bzw. Problem mit SendNetworkData() |
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) |
Autor: | Gimbly [ 12.02.2020 14:59 ] |
Betreff des Beitrags: | Re: Webserver bzw. Problem mit SendNetworkData() |
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 |
Autor: | NicTheQuick [ 12.02.2020 17:07 ] |
Betreff des Beitrags: | Re: Webserver bzw. Problem mit SendNetworkData() |
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") |
Autor: | Gimbly [ 12.02.2020 18:56 ] |
Betreff des Beitrags: | Re: Webserver bzw. Problem mit SendNetworkData() |
Wahnsinn, das funktioniert! Der Port ist sofort wieder frei. Tausend Dank NicTheQuick Du bist ja so was von genial!!! Kann's noch garnicht fassen. |
Autor: | NicTheQuick [ 12.02.2020 23:26 ] |
Betreff des Beitrags: | Re: Webserver bzw. Problem mit SendNetworkData() |
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. ![]() |
Autor: | Gimbly [ 13.02.2020 20:50 ] |
Betreff des Beitrags: | Re: Webserver bzw. Problem mit SendNetworkData() |
Leider zu früh gefreut. ![]() Hatte nicht richtig getestet. Sobald es einen Request gab, bleibt der Port nach Beenden wie gehabt 60 Sekunden lang gesperrt. |
Autor: | NicTheQuick [ 14.02.2020 11:11 ] |
Betreff des Beitrags: | Re: Webserver bzw. Problem mit SendNetworkData() |
Erklär mal bitte genau die Reihenfolge und die Dinge, die du machst, dass es 60 Sekunden lang nicht mehr geht. |
Autor: | Gimbly [ 14.02.2020 11:56 ] |
Betreff des Beitrags: | Re: Webserver bzw. Problem mit SendNetworkData() |
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. |
Seite 3 von 5 | Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |