weiteres server/client problem

Für allgemeine Fragen zur Programmierung mit PureBasic.
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

weiteres server/client problem

Beitrag von Moxl »

Hallo an alle :allright:

Ich komme gerade bei einem Server/Client Code nicht weiter.
Am besten startet Ihr ihn einfach mal und schickt mehrere Strings über 4 oder 5 Zeichen groß.
Ich denke es liegt nicht an den Threads, da mir das selbe auch bei einem normalen Code mit Fenstern passiert.
Ich habe jetzt nur Threads verwendet, weil ich mit Consolen arbeiten und mich nur auf die Network Befehle konzentrieren wollte.

Probiert es mal aus und berichtet mal ob bei euch alles glatt läuft oder ob ihr auch unvollständige Strings empfangt und/oder Speicherprobleme bekommt.

Vielen Dank schonmal im Vorraus :allright:

Servercode:

Code: Alles auswählen

Global clientid

Procedure networkreceive(parameter)
  Repeat
    Delay(10)
    result=NetworkServerEvent()
    Select  result
      Case  #PB_NetworkEvent_Connect
        clientid=EventClient()
        PrintN("Client verbunden: "+Str(clientid))
      Case  #PB_NetworkEvent_Data
        clientid=EventClient()
        PrintN("Daten zum empfangen bereit")
        *stringsize=AllocateMemory(4)
        result=ReceiveNetworkData(clientid, *stringsize, MemorySize(*stringsize))
        PrintN(Str(result)+" Bytes wurden empfangen")
        If  result<>-1
          stringsize.l=PeekL(*stringsize)
          *string=AllocateMemory(stringsize.l)
          result=ReceiveNetworkData(clientid, *string, MemorySize(*string))
          PrintN(Str(result)+" Bytes wurden empfangen")
          If  result<>-1
            string$=PeekS(*string)
            PrintN(string$)
          EndIf
          FreeMemory(*string)
        EndIf
        FreeMemory(*stringsize)
      Case  #PB_NetworkEvent_Disconnect
        clientid=EventClient()
        PrintN("Client getrennt: "+Str(clientid))
    EndSelect
  ForEver
EndProcedure

OpenConsole()
ConsoleTitle("Server")
If  InitNetwork()<>0
  PrintN("Netzwerk initialisiert...")
  Print("Server wird erstellt...")
  server=CreateNetworkServer(0, 6500, #PB_Network_TCP)
  If  server<>0
    PrintN("erstellt!")
    PrintN("")
    CreateThread(@networkreceive(), parameter)
    Repeat
      input$=Input()
      
      stringsize.l=Len(input$)+1
      *stringsize=AllocateMemory(4)
      PokeL(*stringsize, stringsize.l)
      result=SendNetworkData(clientid, *stringsize, MemorySize(*stringsize))
      PrintN(Str(result)+" Bytes wurden gesendet")
      If  result=MemorySize(*stringsize)
        *string=AllocateMemory(stringsize.l)
        PokeS(*string, input$)
        result=SendNetworkData(clientid, *string, MemorySize(*string))
        PrintN(Str(result)+" Bytes wurden gesendet")
      EndIf
      FreeMemory(*stringsize)
      FreeMemory(*string)
    Until input$="exit"
  Else
    PrintN("nicht erstellt!")
    Input()
    End
  EndIf
Else
  End
EndIf
Clientcode:

Code: Alles auswählen

Procedure networkreceive(verbindung)
  Repeat
    Delay(10)
    result=NetworkClientEvent(verbindung)
    Select  result
      Case  #PB_NetworkEvent_Data
        PrintN("Daten zum empfangen bereit")
        *stringsize=AllocateMemory(4)
        result=ReceiveNetworkData(verbindung, *stringsize, MemorySize(*stringsize))
        PrintN(Str(result)+" Bytes wurden empfangen")
        If  result<>-1
          stringsize.l=PeekL(*stringsize)
          *string=AllocateMemory(stringsize.l)
          result=ReceiveNetworkData(verbindung, *string, MemorySize(*string))
          PrintN(Str(result)+" Bytes wurden empfangen")
          If  result<>-1
            string$=PeekS(*string)
            PrintN(string$)
          EndIf
          FreeMemory(*string)
        EndIf
        FreeMemory(*stringsize)
      Case  #PB_NetworkEvent_Disconnect
        clientid=EventClient()
        PrintN("Client getrennt: "+Str(clientid))
    EndSelect
  ForEver
EndProcedure

OpenConsole()
ConsoleTitle("Client")
If  InitNetwork()<>0
  PrintN("Netzwerk initialisiert...")
  Print("Verbindung wird erstellt...")
  verbindung=OpenNetworkConnection("localhost", 6500, #PB_Network_TCP)
  If  verbindung<>0
    PrintN("erstellt!")
    PrintN("")
    CreateThread(@networkreceive(), verbindung)
    Repeat
      input$=Input()
      
      stringsize.l=Len(input$)+1
      *stringsize=AllocateMemory(4)
      PokeL(*stringsize, stringsize.l)
      result=SendNetworkData(verbindung, *stringsize, MemorySize(*stringsize))
      PrintN(Str(result)+" Bytes wurden gesendet")
      If  result=MemorySize(*stringsize)
        *string=AllocateMemory(stringsize.l)
        PokeS(*string, input$)
        result=SendNetworkData(verbindung, *string, MemorySize(*string))
        PrintN(Str(result)+" Bytes wurden gesendet")
      EndIf
      FreeMemory(*stringsize)
      FreeMemory(*string)
    Until input$="exit"
  Else
    PrintN("nicht erstellt!")
    Input()
    End
  EndIf
Else
  End
EndIf
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

Re: weiteres server/client problem

Beitrag von Moxl »

edit: Die Rückgabewerte von den gesendeten und empfangen Bytes sind bei mir jedesmal korrekt. Nur stürzt das Programm entweder ab und/oder Strings werden nicht vollständig angezeigt.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Re: weiteres server/client problem

Beitrag von KeyKon »

Also bei mir funktioniert das auch bei massivem Rumgespamme.
An ThreadSafe aktivieren gedacht?

Zwei Sachen sind mir aufgefallen, die dürften aber keine Probleme verursachen:

- Ich würde in den Threads nur wenn nichts zu tun ist warten (Default : Delay(10)), du wartest ja bei jedem Schleifendurchgang.
- Da du beim Server clientid nur im Thread verwendest würde ich es nicht Global sondern Static (in der Prozedur) deklarieren.

LG KeyKon
(\/) (°,,,°) (\/)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: weiteres server/client problem

Beitrag von STARGÅTE »

Wie kompilierst du dein Programm?
Unter Unicode geht es zumindest nicht!
Das nächste ist, Thread-Safe muss aktiviert sein.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

Re: weiteres server/client problem

Beitrag von Moxl »

ahhhhhhh vielen dank :D
es funktioniert!!! :bounce:

also 1. threadsafe muss aktiviert sein
und 2. darf es nicht im unicode kompiliert sein :mrgreen:

danke für die tipps :allright:
Benutzeravatar
_sivizius
Beiträge: 98
Registriert: 23.10.2013 15:21

Re: weiteres server/client problem

Beitrag von _sivizius »

Nutze statt
> Len(str$)+1
besser
> StringByteLength(str$)+1+#PB_Compiler_Unicode
dann dürfte das auch im Unicode-Modus gehen
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: weiteres server/client problem

Beitrag von ts-soft »

_sivizius hat geschrieben:Nutze statt
> Len(str$)+1
besser
> StringByteLength(str$)+1+#PB_Compiler_Unicode
dann dürfte das auch im Unicode-Modus gehen

Code: Alles auswählen

StringByteLength(str$, #PB_Unicode) + SizeOf(Character)
wäre wohl die bessere Wahl :lol:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

Re: weiteres server/client problem

Beitrag von Moxl »

Danke :)
Antworten