Seite 2 von 3

Verfasst: 27.06.2008 22:59
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.

Verfasst: 27.06.2008 23:07
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 /:->

Verfasst: 27.06.2008 23:11
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.

Verfasst: 27.06.2008 23:20
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!

Verfasst: 27.06.2008 23:31
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.

Verfasst: 27.06.2008 23:34
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.

Verfasst: 27.06.2008 23:44
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!

Verfasst: 27.06.2008 23:53
von GreyEnt
dank an euch beiden.

ist ja doch einfach. :)
nun hab ich den Speicher nicht gelöscht. aber muß ja auch nicht.

Verfasst: 28.06.2008 10:04
von Kiffi
<OT>
@GreyEnt: Kein Bock mehr auf Deinen alten Usernamen gehabt? ;-)
</OT>

Verfasst: 28.06.2008 10:14
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>