Seite 1 von 2
Recevie/Send NetworkData
Verfasst: 06.08.2013 16:26
von Joel
Die Funktion zum senden von Daten gibt es ja scheinbar nicht mehr. Ich brauche die jedoch trotzdem.
Habe dazu
(siehe HIER) schon ein Beispiel gefunden. Das Beispiel kann aber viel zu viel. z.B. muss nicht unbedingt der Dateiname übertragen werden. Außerdem möchte ich auch nicht immer die Konsole offen haben etc. Meine Software überträgt Screenshots und daher ist das obere Beispiel einfach zu mächtig und überladen.
Ich suche eine einfache Procedure die SendNetworkFile() und ReceiveNetworkFile() implementiert, da ich diese Befehle öfters aufrufe und mein Code sonst sehr groß werden würde, wenn ich das so wie oben mache (siehe Link oben).
Gibt es eine einfache Methode, diese beiden Funktionen wieder zu implementieren?
Re: Recevie/Send NetworkData
Verfasst: 06.08.2013 17:05
von ts-soft
http://forums.purebasic.com/german/view ... 75#p306462
Pakete werden nicht einfach mal so über das Netzwerk geschickt!
Mal so als Anregung:
http://de.wikipedia.org/wiki/OSI-Modell
Das umstellen obigen Codes ohne Console-Ausgabe sollte doch kein Problem sein.
Der Code enthält ja nur die minimalsten Anforderungen, die an so eine Aufgabe zu stellen ist.
Gruß
Thomas
Re: Recevie/Send NetworkData
Verfasst: 06.08.2013 17:24
von STARGÅTE
Ich habs selber noch nicht benutzt, aber das hier sollte doch ein gutes Incldue sein:
EasyNetworkManager [Neu: Log - System][V# 1.3.3][Include]
Re: Recevie/Send NetworkData
Verfasst: 06.08.2013 20:15
von Joel
Re: Recevie/Send NetworkData
Verfasst: 06.08.2013 20:25
von ts-soft
Wenn es Dir nicht so wichtig ist, ob die Datei auch ankommt, ich würde das so nicht nutzen
Was machste, wenn NetworkSendFile #False zurückgibt? Neu senden bis es klappt oder einfach
verzichten.
Aber ich muß ja nicht alles verstehen.
Gruß
Thomas
Re: Recevie/Send NetworkData
Verfasst: 07.08.2013 17:11
von Joel
ts-soft hat geschrieben:Wenn es Dir nicht so wichtig ist, ob die Datei auch ankommt, ich würde das so nicht nutzen
Was machste, wenn NetworkSendFile #False zurückgibt? Neu senden bis es klappt oder einfach
verzichten.
Aber ich muß ja nicht alles verstehen.
Gruß
Thomas
Warum sollte ich -1 bekommen? Ist schon ziemlich unwahrscheinlich, weil dahinter SendNetworkData steht. Wenn das nicht mal funktioniert, dann gibts ein Netzwerkproblem und das Programm hat sowieso ein Problem.
Die PB Funktion SendNetworkFile hat auch nur in diesem Fall -1 zurückgegeben und sonst nichts mehr gemacht.
Re: Recevie/Send NetworkData
Verfasst: 07.08.2013 17:28
von ts-soft
Solange Deine Dateien nicht grösser als 64 K sind, wird es wohl meist funktionieren.
Ich würde es in jedem Falle teilen und mit Header versehen, damit es auch bei
schlechteren Netzwerkverbindungen funktioniert. Gerade in Privathaushalten sieht
man so manche merkwürdige Verkabelung, Hubs statt Switches usw.
Für mich ist Funktion und Sicherheit wichtiger als ein paar Programmzeilen, die sich
in der Programmgrösse eher gar nicht auswirken.
Vielleicht nutzt Du es ja auch nur in Deinem lokalen Netzwerk, dann sollte es egal sein,
aber auch nur dann.
Gruß
Thomas
Re: Recevie/Send NetworkData
Verfasst: 07.08.2013 17:40
von Joel
Also ich sende ständig 100 KB Dateien und ich hatte bisher noch keinen Fehler..
Mich würden die Hintergründe mal Interessieren...Was müsste denn passieren, das NetworkSendFile #False zurückgibt?
Re: Recevie/Send NetworkData
Verfasst: 07.08.2013 18:11
von Chimorin
Du kannst doch nen Header machen...
Client schickt: Paketzahl = 0, Max. Anzahl an Paketen, Dateiname
Server antwortet: Dateiname, ID (Serververwaltungszeug, ne Liste für Dateien oder so)
Client: ID, Paketzahl, Max. Paketzahl, Daten
Achja, immer gleich große Pakete verwenden, dann gibt's keine Probleme.
Wenn du Zeug aus der Datei ausliest, musst du den Inhalt, auf den dein Pointer zeigt, gleich verschlüsseln (Base 64 oder so). Nun kannst du den Inhalt weiterverschicken (Grund: In Dateien finden sich auch 00 Zeichen, für die Stringleser ein String-Endzeichen).
Re: Recevie/Send NetworkData
Verfasst: 07.08.2013 18:54
von Joel
Bananenfreak hat geschrieben:Du kannst doch nen Header machen...
Client schickt: Paketzahl = 0, Max. Anzahl an Paketen, Dateiname
Server antwortet: Dateiname, ID (Serververwaltungszeug, ne Liste für Dateien oder so)
Client: ID, Paketzahl, Max. Paketzahl, Daten
Das macht der Code doch, wenn ich mich nicht total irre. Er übermittelt die Dateigröße, nicht die Paketmenge. Dateiname wird auch übertragen. Oder meinst du was anderes?
Code: Alles auswählen
Procedure.i NetworkSendFile(Connection.i, Filename$)
Protected Result.i, File.i, Size.q, *Buffer, Offset.i
File = ReadFile(#PB_Any, Filename$)
If File
Size = Lof(File)
Filename$ = "FILE:" + GetFilePart(Filename$) + ":" + Str(Size)
*Buffer = AllocateMemory(Size + Len(Filename$) + 1)
If *Buffer
PokeS(*Buffer, Filename$)
If ReadData(File, *Buffer + Len(Filename$) + 1, Size) = Size
If SendNetworkData(Connection, *Buffer, MemorySize(*Buffer)) = MemorySize(*Buffer)
Result = #True
EndIf
EndIf
EndIf
CloseFile(File)
EndIf
ProcedureReturn Result
EndProcedure
Code: Alles auswählen
Procedure.i NetworkReceiveFile(ClientID.i, *Buffer, RcvBytes.q, Path$="")
Protected Line$, Filename$, FileSize.q, *NewBuffer, Count.i
Line$ = PeekS(*Buffer, RcvBytes)
If StringField(Line$, 1, ":") = "FILE"
Filename$ = StringField(Line$, 2, ":")
FileSize = Val(StringField(Line$, 3, ":"))
If FileSize > 0
RcvBytes - Len(Line$) - 1
If Path$ = ""
Path$ = PathRequester("Choose a directory", "")
EndIf
If Path$ <> ""
File = CreateFile(#PB_Any, Path$ + Filename$)
If File
WriteData(File, *Buffer + Len(Line$) + 1, RcvBytes)
EndIf
EndIf
Count = 0
While RcvBytes < FileSize And Count >= 0
Count = ReceiveNetworkData(ClientID, *Buffer, MemorySize(*Buffer))
If Count > 0
If IsFile(File)
WriteData(File, *Buffer, Count)
EndIf
RcvBytes + Count
EndIf
Wend
If IsFile(File)
If RcvBytes = FileSize
Result = #True
EndIf
CloseFile(File)
EndIf
EndIf
EndIf
ProcedureReturn Result
EndProcedure
Bananenfreak hat geschrieben:Achja, immer gleich große Pakete verwenden, dann gibt's keine Probleme.
Wenn du Zeug aus der Datei ausliest, musst du den Inhalt, auf den dein Pointer zeigt, gleich verschlüsseln (Base 64 oder so). Nun kannst du den Inhalt weiterverschicken (Grund: In Dateien finden sich auch 00 Zeichen, für die Stringleser ein String-Endzeichen).
Ob das passieren kann weiß ich nicht. Kann es sein, das der Code-Ersteller (siehe oben) das Problem schon berücksichtigt hat? Bin mir nicht sicher.