Memory Inhalt löschen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

ts-soft hat geschrieben:

Code: Alles auswählen

ZeroMemory_(*buffer, MemorySize(*buffer))
Hiermit will TS-Soft uns sagen, dass es einen Windows-API Befehl gibt, der genau das gleiche macht wie meine Löschmethode 2.
Im Grund ist es egal, ob du den API-Befehl nimmst, oder meine Löschmethode 2.
Man könnte sagen, dass meine handlicher ist, da sie automatisch MemorySize() aufruft.
TS-Soft hat geschrieben:Mir ist der Sinn des löschens sowieso nicht klar, wenn er sowieso wieder überschrieben wird
Wie ich berichtete, schreibt ReceiveNetworkString() nicht zwangsweise eine abschließende Null hinter jeden Datenblock. Das habe ich bereits angedeutet. Es könnte ja z. B. sein, dass die empfangenen Daten eine Null enthalten, was macht man dann?
Allein schon deshalb ist es notwendig, den Buffer vor dem nächsten Datenhäppchen zu löschen.
Zuletzt geändert von AND51 am 27.06.2008 23:11, insgesamt 1-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Achso, aber es gibt die Zahl der gelesenen Bytes wieder, die kann man bei
PeekS angeben, da ist dann kein Nullbyte erforderlich.

Mit den Netzwerkbefehlen hab ich ja bisher nicht viel gemacht, deshalb
mußte ich erstmal das eigentliche Problem erkennen /:->
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> aber es gibt die Zahl der gelesenen Bytes wieder, die kann man bei PeekS angeben, da ist dann kein Nullbyte erforderlich
Das ist richtig. Deine Lösung ist natürlich auch korrekt, allerdings sollten wir GreyEnt fragen, ob er das versteht, denn wir sind ja hier im Anfängerforum.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Warum, ist doch so viel einfacher:

Code: Alles auswählen

Repeat
  bytes = ReceiveNetworkData(ClientID, *Buffer, 1000)
  If bytes
    recstring$ = PeekS(*Buffer, bytes)
    PrintN("String: " + recstring$ + "*")
  EndIf
Until bytes = 0
Für Unicode sind aber noch Anpassungen erforderlich!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag von GreyEnt »

danke für die ganze mühe.
das Problem mit der "Abschließenden Null" hab ich verstanden. ich stell hier mal eben die beiden Beispiele rein.

hier der Client

Code: Alles auswählen

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832

IPText$ = InputRequester("IP- Nummer eingeben","Gib hier die IP Nummer ein.","0.0.0.0")
;IPText$="192.168.1.3"

OpenConsole()
ConsoleTitle("netClient")
PrintN("Escape zum beenden")

ConnectionID = OpenNetworkConnection(IPText$, Port)

If ConnectionID
PrintN("Client connected to server...")

Repeat
KeyPressed$ = Inkey()

If KeyPressed$="m"
netinput$=InputRequester("netClient", "Gib einen String ein...","Test")
SendNetworkString(ConnectionID,netinput$)
EndIf

Delay(100)
Until KeyPressed$ = Chr(27) ; Wartet, bis Escape gedrückt wird

CloseNetworkConnection(ConnectionID)

Else
PrintN("Can't find the server (Is it launched ?).")
PrintN("Taste druecken")
String$ = Input()
EndIf ; ConnectionID

CloseConsole()
End

und nun der Server

Code: Alles auswählen

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832
*Buffer = AllocateMemory(1000)


If CreateNetworkServer(0, Port)

OpenConsole()
ConsoleTitle("netServer")
PrintN("Escape zum beenden")
PrintN("Server created (Port "+Str(Port)+").")
  
  Repeat
  KeyPressed$ = Inkey()
      
    SEvent = NetworkServerEvent()
  
    If SEvent
    
      ClientID = EventClient()
  
      Select SEvent
      
        Case 1
          PrintN("A new client has connected !")
  
        Case 2
          PrintN("Client "+Str(ClientID)+" has send a packet !")

          len.l=ReceiveNetworkData(ClientID, *Buffer, 1000)
          recstring$=PeekS(*Buffer)
          PrintN("String: "+recstring$+"* mit Länge von "+Str(len))
          ;ReAllocateMemory(*Buffer,1)
          ;ReAllocateMemory(*Buffer,1000)  
        Case 3
          PrintN("Client "+Str(ClientID)+" has send a file via the network !")
          ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
  
        Case 4
          PrintN("Client "+Str(ClientID)+" has closed the connexion...")
          ;Quit = 1
    
      EndSelect
    EndIf
  
  Delay(100)
  Until KeyPressed$ = Chr(27) ; Wartet, bis Escape gedrückt wird
  
CloseNetworkServer(0)
Else
PrintN("Can't create the server (port in use ?).")
EndIf
CloseConsole()  
End   
Im Client Fenster "m" für neuen String übermitteln.
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ohne es ausprobiert zu haben, sage ich mal das liegt an SendNetworkString().

Kein Wunder, denn:

SendNetworkString() ist nur eine schnelle Art, Daten zu senden. Dieser Befehl sendet Daten bewusst ohne abschließende Null! Das müsstest du entweder selber erledigen oder -wie ich dir empfehle- du sendest deine Daten mit SendNetworkData(). Letzterer hängt auch eine abschließende Null automatisch dran.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Im Server wie bereits gesagt anpassen:

Code: Alles auswählen

        Case 2
          PrintN("Client "+Str(ClientID)+" has send a packet !")

          len.l=ReceiveNetworkData(ClientID, *Buffer, 1000)
          recstring$=PeekS(*Buffer, len); <<< -----
          PrintN("String: "+recstring$+"* mit Länge von "+Str(len))
Funktioniert einwandfrei bei mir!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag von GreyEnt »

dank an euch beiden.

ist ja doch einfach. :)
nun hab ich den Speicher nicht gelöscht. aber muß ja auch nicht.
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

<OT>
@GreyEnt: Kein Bock mehr auf Deinen alten Usernamen gehabt? ;-)
</OT>
a²+b²=mc²
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Beitrag von rolaf »

Kiffi hat geschrieben:<OT>
@GreyEnt: Kein Bock mehr auf Deinen alten Usernamen gehabt? ;-)
</OT>
<OOT>
Huch - war das vorher nicht der Dieter Plazenta? :wink:
</OOT>
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Antworten