WebSocket Server

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Dein Code den du im englischen Forum gepostet hast funktioniert, wenn man eben KEINE Liste nimmt sondern ein Array:


server:

Code: Alles auswählen




OpenConsole()
Server = CreateNetworkServer(#PB_Any, 8090, #PB_Network_TCP)
Dim client(2000)

*Temp = AllocateMemory(1000)

Repeat
  Repeat
    Select NetworkServerEvent(Server)
      Case #PB_NetworkEvent_None
        ; We have got no events, so do something else or wait.
        Break
        
      Case #PB_NetworkEvent_Connect
        PrintN("Connect: " + EventClient())
        ; Add EventClient() to our list of clients.
        clientanz+1
        client(clientanz)=EventClient()
        
      Case #PB_NetworkEvent_Disconnect
        PrintN("Disconnect: " + EventClient())
        ; Delete EventClient() from our list of clients.
        
      Case #PB_NetworkEvent_Data
        ; Read data, but do nothing with it.
        ReceiveNetworkData(EventClient(), *Temp, MemorySize(*Temp))
        
    EndSelect
  ForEver
  
  Delay(10)

  
ForEver


client:

Code: Alles auswählen



For i = 1 To 400
  Conn = OpenNetworkConnection("localhost", 8090, #PB_Network_TCP , 1000)
Next
Repeat
  Delay(10)
ForEver

  
  

Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Dadido3
Beiträge: 119
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

stevie1401 hat geschrieben: 04.04.2025 18:38 Dein Code den du im englischen Forum gepostet hast funktioniert, wenn man eben KEINE Liste nimmt sondern ein Array:
Wie meinst du das? Du hast aber bei deinem Code mehr als nur die Liste herausgenommen. Wenn ein Chirurg anstatt dem schmerzenden Blinddarm alle Organe rausnimmt hat der Patient nach der Operation natürlich auch keine Beschwerden mehr.

Hier wäre ein äquivalenter Code ohne verlinkte Listen:

Code: Alles auswählen

OpenConsole()

Server = CreateNetworkServer(#PB_Any, 8090, #PB_Network_TCP)

MaxClients = 1000
Clients = 0

Dim Client.i(MaxClients)

DataSection
  SomeData:
  Data.a 10, 20, 30, 40, 50, 60, 70, 80, 90, 100
  SomeDataEnd:
EndDataSection

*Temp = AllocateMemory(1000)

Repeat
  Repeat
    Select NetworkServerEvent(Server)
      Case #PB_NetworkEvent_None
        ; We have got no events, so do something else or wait.
        Break
        
      Case #PB_NetworkEvent_Connect
        PrintN("Connect: " + EventClient())
        ; Add EventClient() to our list of clients.
        If Clients >= MaxClients
          DebuggerError("Max. number of clients reached!")
        EndIf
        Client(Clients) = EventClient() : Clients + 1
        
      Case #PB_NetworkEvent_Disconnect
        PrintN("Disconnect: " + EventClient())
        ; Delete EventClient() from our list of clients.
        For i = 0 To Clients-1
          If Client(i) = EventClient()
            ; Overwrite found element with last one, then delete the last element.
            Client(i) = Client(Clients-1) : Clients - 1
            Break
          EndIf
        Next
        
      Case #PB_NetworkEvent_Data
        ; Read received data, but do nothing with it.
        ReceiveNetworkData(EventClient(), *Temp, MemorySize(*Temp))
        
    EndSelect
  ForEver
  
  Delay(10)
  
  ; Send random data to the clients.
  ; It doesn't matter what is sent.
  For i = 0 To Clients-1
    Result = SendNetworkData(Client(i), @SomeData, @SomeDataEnd - @SomeData)
    If Result > 0
      PrintN("Sent data")
    Else
      PrintN("Failed to send data")
    EndIf
  Next
  
ForEver
Dieser zeigt den Absturz genau wie der Code mit der verlinkten Liste. Daran liegt es also nicht.
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Lustig, bei mir funtioniert dein Code wunderbar :)
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Dadido3
Beiträge: 119
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

"funktioniert" im Sinne von "stürzt nicht ab"? Das ist seltsam. Versuch es mal exakt wie ich es hier im Video zeige:

https://www.youtube.com/watch?v=lr81N2UHkNg

und nutze auch die beiden Codeschnipsel aus dem anderen Thread.
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Das habe ich geran. Allerdings mit Debian 12. Bei Linux Mint 22.1 funktioniert bei mir nicht einmal der interne Debugger und ich bekomme trotz Openconsole() keine Konsole angezeigt.
Ein mit Debian 12 compilierter Code läuft bei mir allerdings auch problemlos mit Linux Mint 22.1.
Der Code im englishen Forum funktioniert nicht, nur dann, wenn ich die Liste in ein Array umwandel.
Ich denke schon, wenn man alle Listen in deinem Code deines Webservers in Arrays umwandeln würde, würde auch dieser problemlos funktionieren.
Ich habe es versucht, aber ich bekomme das einfach nicht hin.

Ich vermute Netzwerksachen UND Listen sind bei Purebasic fehlerhaft.

Ich habe alles noch einmal mit Purebasic 5.73 getestet.
Der Code mit Listen funktioniert NICHT. Der Code mit Array fuktioniert.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Dadido3
Beiträge: 119
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

stevie1401 hat geschrieben: 05.04.2025 01:26 Das habe ich geran. Allerdings mit Debian 12. Bei Linux Mint 22.1 funktioniert bei mir nicht einmal der interne Debugger und ich bekomme trotz Openconsole() keine Konsole angezeigt.
Ein mit Debian 12 compilierter Code läuft bei mir allerdings auch problemlos mit Linux Mint 22.1.
Der Code im englishen Forum funktioniert nicht, nur dann, wenn ich die Liste in ein Array umwandel.
Ich denke schon, wenn man alle Listen in deinem Code deines Webservers in Arrays umwandeln würde, würde auch dieser problemlos funktionieren.
Ich kann jetzt aber leider nicht den kompletten Code auf Arrays umbauen, und das nur um einen Fehler in PureBasic zu umgehen. Das ist keine Sache die schnell gemacht ist, erst recht wenn alles dynamisch bleiben soll und es keine feste maximale Anzahl an Clients oder Paketen geben soll.

Auch hat es in meinen Tests keinen Unterschied gemacht ob ich Arrays oder Listen verwendet habe. Anscheinend ist das in deiner Testumgebung aber ein klein wenig anders; der Fehler ist somit doch ein wenig schwerer einzugrenzen.
stevie1401 hat geschrieben: 05.04.2025 01:26 Ich vermute Netzwerksachen UND Listen sind bei Purebasic fehlerhaft.

Ich habe alles noch einmal mit Purebasic 5.73 getestet.
Der Code mit Listen funktioniert NICHT. Der Code mit Array fuktioniert.
Ich denke der Bugreport, der jetzt Netzwerkbefehle und Listen einbezieht, sollte das Problem vollständig abdecken. Fred wird bestimmt beim Debuggen merken an was es wirklich liegt. Womöglich steckt da ein grundlegender Fehler hinter, welcher mehrere Teile von PB betrifft und erst in bestimmten Konfigurationen auftritt.

Eventuell würde es helfen wenn man zeigt, dass das Problem auch auf anderen Distributionen herbeizuführen ist. Das würde Fred eher davon überzeugen sich dem Problem anzunehmen. Zum Beispiel Ubuntu 22.04, oder 24.04. Wenn ich zeit dafür habe, installiere ich mir die mal.

Bis das Problem aber behoben ist musst du zum Kompilieren/Ausführen auf eine andere Distro wechseln, welche das Problem nicht zeigt. Mehr kann ich im Moment auch nicht machen.
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

"Ich kann jetzt aber leider nicht den kompletten Code auf Arrays umbauen, und das nur um einen Fehler in PureBasic zu umgehen. Das ist keine Sache die schnell gemacht ist, erst recht wenn alles dynamisch bleiben soll und es keine feste maximale Anzahl an Clients oder Paketen geben soll."

Ja, das ist ein echtes Argument.

Leider habe ich noch keine Linuxdistribution gefunden, mit der dein Servercode ohne Array funktioniert, aber ich suche weiter.
Erst einmal vielen lieben Dank für deine Mühen!

Stevie
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Dadido3
Beiträge: 119
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

@stevie1401

Habe gerade gesehen, dass nun die PureBasic Beta 5 raus ist; Fred hat das Problem behoben. Soweit ich es getestet habe, scheint hier nun auch alles unter Linux zu funktionieren. Du kannst dich ja mal melden ob du noch Probleme hast, aber ich denke jetzt müsste alles reibungslos laufen.

https://www.purebasic.fr/english/viewtopic.php?t=86528
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Danke für den Tip, ich habs schon gesehen und gleich ausprobiert.
Bis jetzt ist der Server noch nicht abgestürzt und auch in meiner Testumgebung, wo ich ihn wirklich "quälen" kann, läuft er gut.

Aber ich bin mir nicht sicher, ob es da nicht noch weitere Lunx-Bugs gibt.
Siehe hier:
viewtopic.php?p=367586#p367586
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Antworten