>>
"Du benutzt als Abbruchkriterium deiner beiden Repeat-Schleifen (Empfänger) die Größe des Sendepuffers, der dir aber im Normalfall nicht bekannt ist. Wie würdest du die Abbruchkriterien deiner Schleifen gestalten, wenn dir als Empfänger #Length unbekannt ist?"
Wenn du selber dafür verantwortlich bist, was du sendest, ist es Ratsam immer die Länge mitzusenden, damit beim emfangen das "Paket" wieder rekonstruiert werden kann.
Denn es ist auch durchaus möglich, das zwei unterschiedliche Sends zu einem Receive verschmelzen.
Wenn dann die Länge nicht bekannt war, kannst du die nicht mehr trennen.
Code: Alles auswählen
InitNetwork()
#Length = 1024
If CreateNetworkServer(0, 7000)
Connection = OpenNetworkConnection("localhost", 7000)
*Buffer = AllocateMemory(#Length)
Debug "Gesendet: "+Str(SendNetworkData(Connection, *Buffer, 50))
Debug "Gesendet: "+Str(SendNetworkData(Connection, *Buffer, 50))
Delay(100)
Repeat
Delay(10)
Select NetworkServerEvent()
Case #PB_NetworkEvent_Data
Repeat
Length = ReceiveNetworkData(EventClient(), *Buffer+Shift, #Length)
Debug "Empfangen: "+Str(Length)
If Length > 0
Shift + Length
EndIf
Until Length <= 0 Or Shift = 100
EndSelect
Until Shift = 100
Debug "Gesamt: "+Str(Shift)
Else
Debug "geht nicht"
EndIf
Die beiden 50Bytes kommen als ein "Block" 100Bytes an ...
Eine Abbruchebedingung ohne bekannter Länge ist eigentlich nich möglich, weil du nie weiß, ob das nun schon das letzte Byte war.
Denn wie du siehst muss durchaus mehrmals NetworkServerEvent() aufgerufen werden um alles zu erhalten.
Es reicht daher nicht nur bei ReceiveNetworkData abzuwarten bis nix mehr da ist.
Ich habe für meine Bedürfnisse, ein Include geschrieben, in dem Daten "sicherer" gesendet/empfangen werden.
Dabei wird halt immer die Länge des Pakets als Long in den ersten 4 Bytes gesendet.
>>
"Könnte es vorkommen, daß bei bei quasi-gleichzeitigen Requests von mehreren clients du innerhalb deiner NetworkServerEvent()-Schleife verschiedene client-id's bekommst?"
Nein.
Dann bekommst du zwei mal ein #PB_NetworkEvent_Data bei NetworkServerEvent() mit verschiedenen EventClient()
Dabei hat jeder Client einen Eingangsbuffer von irgendwas mit 100KB ist dieser voll kann nichts mehr gesendet werden, erst wenn mit ReceiveNetworkData der Buffer ausgelesen wird.
EDIT: Im echten Netzwerk (kein localhost) ist der Buffer sogar noch kleiner ...