Seite 1 von 1

ReceiveNetworkdata() gibt -1 aus ?

Verfasst: 29.12.2004 20:06
von crX
Hallo!
Ich bastel im Moment an was, was mit etwas Glück ein Messenger werden könnte. Dabei habe ich im Hauptproggy (Server) einfach ein Script, dass die Daten an den entsprechenden Client weiterleiten soll, funzt wunderbar, soweit es fertig ist:


Server

Code: Alles auswählen

InitNetwork()
cns = CreateNetworkServer(86)

Debug cns
buffersize = 4096
*buffer = AllocateMemory(buffersize)
quit = 0
If cns
  Repeat
  
    nse = NetworkServerEvent()
    If nse
    ncid = NetworkClientID()
      Select nse
        Case 1 ;client connects
          Debug "new client"
          If client = 0
            localuser = ncid
          EndIf
          
          client = client + 1
          
        Case 2 ;rawdata sent
          rnd = ReceiveNetworkData(ncid, *buffer, buffersize)
          message.s = PeekS(*buffer, rnd)
          Debug message.s
          
          If ncid <> localuser Or message.s = "quit" + #CRLF$
            SendNetworkString(localuser, message.s)
          EndIf
          
        Case 3 ;file sent 
          Debug "geht nix"
          
        Case 4 ;disconnect
          Debug "client lost"
          If ncid = localuser
            Debug "it was the local user » quitting server"
            quit = 1
          EndIf
            
        Default
        Delay(1)      
      EndSelect
    EndIf
    Delay(10)
  Until quit = 1
Else
  Debug "error » could not create server on port 86"
EndIf
CloseNetworkServer()
Debug "Done."
Darauf soll zunächst (erster Client, dessen connectionID auch dann in der variable localuser gespeichert wird) das GUI zugreifen:

Client 1 (localuser)

Code: Alles auswählen

InitNetwork()


Procedure getserverdata(oncp)
  *bufferp = AllocateMemory(4096)  
  Repeat  
    nce = NetworkClientEvent(oncp)    
    If nce
      Select nce
      
        Case 2
          rndp = ReceiveNetworkData(oncp, *bufferp, 4096)
          PrintN(Str(rndp))
          
          If rndp < 0
            rndp = 6
          EndIf
          
          messagep.s = PeekS(*bufferp, rndp)
          PrintN(messagep.s)
          
          If Left(messagep.s, 4) = "quit"
            quitp = 1
            FreeMemory(*bufferp)
            CloseNetworkConnection(oncp)
            nce = 0
          EndIf
          
        Case 3
          PrintN("muh, geht nix")
          
        Default
          Delay(5)
          
      EndSelect      
    EndIf    
  Until quitp = 1  
EndProcedure

quit = 0
OpenConsole()
onc = OpenNetworkConnection("127.0.0.1", 86)
If onc
  Repeat
  cth = CreateThread(@getserverdata(), onc)
  inp.s = Input()
  
  PrintN("")
  If inp.s = "quit"
    quit = 1
  EndIf
  SendNetworkString(onc, inp.s + #CRLF$)
  
  Until quit = 1
  WaitThread(cth)
  PrintN("Program execution finished.")
  Print("enter to exit")
  Input()
Else
  PrintN("Could not open Network Connection")
  Print("enter to exit")
  Input()
EndIf
Ist im Moment noch eine Konsole. Wie auch immer, die Konsole sendet alle Eingaben ( Input() ) an den Server geschickt. mit allen Eingaben geschieht nix, die gehen ins Datennirvana, das ist gewollt. Aber sobald das Kommando "quit" gesendet wird (ergänzung, alle gesendeten Daten haben hintendran #CRLF$), schickt der Server das Kommando zurück, damit sich der Thread beendet.

Schön und Gut. Tut er auch, wenn quit das erste Kommando ist. Aber sobald vorher ein String gesendet wurde, beendet sich der Prozess nicht. Er findet es nämlich nötig, für die Länge der erhaltenen Daten (die er de Facto nicht erhält) eine Länge < 0 auszugeben, um genau zu sein -1.

Kann mir bitte jemand sagen, warum?
mfg
crX

Verfasst: 30.12.2004 00:45
von THEEX
Entferne mal Deine Schleife innerhalb der Procedure, die brauchst Du gar nicht, da diese innerhalb einer Schleife immer wieder aufgerufen wird.

Nachtrag:
Allerdings solltest Du nach jedem ReceiveNetworkData(oncp, *bufferp, 4096) *bufferp wieder freigeben, da sich der Speicherbedarf nach jedem gesendetem Wort weiter vergrößert.... Du reservierst bei Jedem senden neuen Speicher.

Verfasst: 30.12.2004 11:12
von crX
Aua...

Hab den Fehler einfach nicht gesehen... :oops:

Danke für die Hilfe, CSprengel. :allright: