Seite 2 von 3
Verfasst: 27.06.2008 22:59
von AND51
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?
</OOT>