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
Habe was im Englischen Forum gefunden: http://www.purebasic.fr/english/viewtop ... 13&t=52705

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 :wink:
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 :wink:
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.