Seite 1 von 1

Speicher nullen

Verfasst: 04.08.2009 02:27
von Sven
Ich schreibe mit SendNetworkString(ClientID, text) einen String an einen Port. Dabei wird laut Hilfe keine 0 ans Ende gestellt. Ist auch sinnvoll, weil sonst folgende Strings verlorengingen, wenn sie geschrieben werden, bevor der Port gelesen wird.

Jetzt lese ich auf der Gegenseite den Port aus.

Code: Alles auswählen

*Buffer = AllocateMemory(65535)
ReceiveNetworkData(connID, *Buffer, 65535)
text.s = PeekS(*Buffer)
Soweit ganz gut. Dummerweise bleibt jetzt der alte String im Speicher. Wenn ein neuer String kommt, der kürzer ist, bekomme ich immer die Reste vom alten String mit, da ja nicht nullterminiert gesendet wird, und die Terminierung beim PeekS nur entsteht, weil der Speicher vorher Null war.

Ich muss also nach dem Auslesen des String den Speicher wieder nullen, aber wie?

eine For-Next über den Speicherbereich jagen?
FreeMemory und erneutest AllocateMemory(65535)?

Beides scheint mir nicht sehr elegant. Sollte das wirklich die Lösung sein? Nach jedem Auslesen des Strings?

Verfasst: 04.08.2009 08:07
von Kaeru Gaman
> FreeMemory und erneutest AllocateMemory(65535)?

sollte das Übliche sein.

Code: Alles auswählen

*Buffer = AllocateMemory(65535)
ReceiveNetworkData(connID, *Buffer, 65535)
text.s = PeekS(*Buffer)
FreeMemory(*Buffer)
gleich wieder freigeben, gar nicht lang rumdümpeln lassen.


... ich glaub, da gabs noch ne API Funktion zum speicher nullen, die beim Allocate mit Nullen zusätzlich aufgerufen wird...
aber k.P. wie die heißt.

Verfasst: 04.08.2009 08:32
von STARGÅTE
Dieses ASM-Stück, gibs hier im Forum, den Autor weiß ich leider nicht mehr:

Code: Alles auswählen

Procedure ClearMemory(*MemoryBuffer, Length)
  !xor eax,eax 
  !mov edi,dword[p.p_MemoryBuffer] 
  !mov ecx,dword[p.v_Length] 
  !mov ebx,ecx 
  !shr ecx,2 
  !rep stosd 
  !mov ecx,ebx 
  !and ecx,3 
  !rep stosb 
EndProcedure

Verfasst: 04.08.2009 08:39
von hjbremer
unter Windows

ZeroMemory_(*mem,lg)

Verfasst: 04.08.2009 10:13
von Vera
STARGÅTE hat geschrieben:Dieses ASM-Stück, gibs hier im Forum, den Autor weiß ich leider nicht mehr:
von Thorium ~ siehe hier in ClearMemory(*MemoryBuffer, length)

Gruß ~ Vera

Verfasst: 04.08.2009 10:44
von Deluxe0321

Code: Alles auswählen

*Buffer = AllocateMemory(65535)
Repeat
Empfangen = ReceiveNetworkData(connID, *Buffer, 65535)
text.s + PeekS(*Buffer,Empfangen)
If Not Empfangen = 65535
  Break
EndIf  
ForEver
ReciveNetworkData gibt doch an wieviel Empfangen wurde, warum also den Speicher immer wieder neu erstellen bzw. cleanen?

Verfasst: 04.08.2009 14:44
von Sven
Hmpf, natürlich. Das hab ich glatt übersehen. Dann kann ich mir das Nullen freilich sparen.

Verfasst: 04.08.2009 17:44
von NicTheQuick
Ich hätte es so gemacht, dass ich vor dem String noch ein Long oder Int sende, dass die
Anzahl der folgenden Bytes oder Zeichen angibt. Dann weiß man schon vor dem eigentlich
String, wie lang er werden muss.

Schließlich kann es auch passieren, dass 'ReceiveNetworkData()' kleinere Blöcke als
angefragt zurückgibt. Und so würde Deluxe0321s Methode auch abbrechen, obwohl der
String noch nicht zu Ende ist.

Wenn man als Empfänger also vorher schon weiß, wieviel kommen wird, kann man weder
zu wenig noch zu viel empfangen. Deswegen müsste es auch von mir noch irgendwo hier
im Forum Procedures geben, die nur zum String-Senden und -Empfangen gedacht waren.

Hier ist der Thread dazu: SendNetworkStructure (muss aber noch angepasst werden)

Verfasst: 05.08.2009 10:12
von Deluxe0321
@NicTheQuick
selbstverständlich, eine Var für die Größe sollte auch mitgesendet werden. Das verhindert auch, dass ein paar böse leute den server Lahmlegen können (wenn auch nur halbwegs) ^^