Problem Timing ReceiveNetworkData(
Verfasst: 21.01.2017 19:26
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?
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