Seite 1 von 1

weiteres server/client problem

Verfasst: 06.11.2014 19:30
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

Re: weiteres server/client problem

Verfasst: 06.11.2014 19:33
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.

Re: weiteres server/client problem

Verfasst: 06.11.2014 21:46
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

Re: weiteres server/client problem

Verfasst: 06.11.2014 23:37
von STARGÅTE
Wie kompilierst du dein Programm?
Unter Unicode geht es zumindest nicht!
Das nächste ist, Thread-Safe muss aktiviert sein.

Re: weiteres server/client problem

Verfasst: 06.11.2014 23:45
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:

Re: weiteres server/client problem

Verfasst: 06.11.2014 23:59
von _sivizius
Nutze statt
> Len(str$)+1
besser
> StringByteLength(str$)+1+#PB_Compiler_Unicode
dann dürfte das auch im Unicode-Modus gehen

Re: weiteres server/client problem

Verfasst: 07.11.2014 00:05
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:

Re: weiteres server/client problem

Verfasst: 07.11.2014 14:00
von Moxl
Danke :)