Problem Timing ReceiveNetworkData(

Anfängerfragen zum Programmieren mit PureBasic.
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Problem Timing ReceiveNetworkData(

Beitrag von schleicher »

Im Grunde funktioniert die Verbindung, nur wenn der Server nicht gleich die Antwort schickt(weil die Ausführung länger dauert) dann bleibt die Ausgabe von Getstring leer bzw. nur ein Teil kommt zurück
Die habe ich bisher nur hinbekommen, wenn ich zwischen dem Sendstring() und getstring() einen größeren Delay() gesetzt habe. Damit funktioniert es zwar, aber gib es da nicht eine bessere Lösung ?
Muss ich getstring anders schreiben ? Wenn ja dann wie?

Code: Alles auswählen

EnableExplicit
Global ConnectionID

Global IP.s="192.168.40.29"               ;hier anpassen
Global User.s="root"
Global Pass.s=""
Global Port=23

Declare    connect()
Declare    SendString(ConnectionID, String.s)
Declare .s GetString(ConnectionID, TimeOut = 5000)

InitNetwork()
ConnectionID=connect()
Debug ConnectionID

Procedure connect()
  Protected connec.s
  
  ConnectionID= OpenNetworkConnection(IP, Port)
  
  If ConnectionID
    
    ;Delay(100)
    connec.s = GetString(ConnectionID)
    Debug connec
    If FindString(connec, "login:", 1, #PB_String_CaseSensitive)
      SendNetworkString(ConnectionID, User +#CRLF$, #PB_Ascii)
      Delay(100)
      connec.s = GetString(ConnectionID)
      Debug connec
      Delay(100)
      If FindString(connec, "Password", 1, #PB_String_CaseSensitive)
        If SendNetworkString(ConnectionID, Pass +#CRLF$, #PB_Ascii)
          Delay(500)
          connec.s = GetString(ConnectionID)
          Debug connec
        EndIf
      EndIf
    EndIf
    ProcedureReturn ConnectionID
  Else
    MessageRequester("Error", "Please check IP and Port ! ", #MB_ICONERROR)
  EndIf
  
EndProcedure

Procedure SendString(ConnectionID, String.s)
  
  Protected Size, *Buffersend, Result = #Null
  
  String = String + #CRLF$
  Size = StringByteLength(String, #PB_UTF8) + 1
  
  *Buffersend = AllocateMemory(size)
  
  If *Buffersend
    PokeS(*Buffersend, String, Size, #PB_UTF8)
    Result = SendNetworkData(ConnectionID, *Buffersend, MemorySize(*Buffersend)-1)
    FreeMemory(*Buffersend)
  EndIf
  
  ProcedureReturn Result     
  
EndProcedure

Procedure.s GetString(ConnectionID, TimeOut = 5000)
  
  Protected *Buffer, t, Size, Text.s
  
  Delay(200)
  *Buffer = AllocateMemory(65536)
  t = ElapsedMilliseconds()
  
  If *Buffer
    
    While NetworkClientEvent(ConnectionID) <> 2 And ElapsedMilliseconds()-t < Timeout
      Delay(100)
    Wend
    
    Repeat
      Size=ReceiveNetworkData(ConnectionID, *Buffer,  65536)
      Text.s = PeekS(*Buffer, Size, #PB_Ascii)
      If Size<65536 
        Break
      EndIf
    ForEver
    
    FreeMemory(*Buffer)
    
    ProcedureReturn Text   
    
  EndIf
  
EndProcedure
Purebasic 5.51
Antworten