Seite 3 von 3

Verfasst: 08.02.2005 17:46
von stbi
netfreak hat geschrieben:@stbi: Allein das er doch diese 100% verbraucht! und das er es ganz in die Ram ladet ist doch schon sch**ße!
Full ACK! Müsste wirklich nicht sein. Aber solange man keine DVD-ISOs hin- und herschiebt, sollte es halbwegs gehen. Wenn Du bei deutlich kleineren Dateien als meine 20 MB Probleme hast, dann könnte es aber auch an Deinem Netzwerk liegen.

Ich habe Andre gebeten, die SendNetworkFile()-Problematik an Fred weiterzuleiten. Dürfte wohl kein Problem sein, die Datei direkt auszulesen statt erst über einen MemBuffger zu gehen.

Verfasst: 08.02.2005 18:12
von nicolaus
Ok da hier weiter oben von Chat und daten senden und empfangen die rede war habe ich mal nen sehr alten code von einem chatserver und chatclient auf den server gelegt sodas ihr euch den downloaden könnt und darin rumstöbern könnt. Ich sag gleich dazu das server sowie client als die kompilierte exe in der zip zwar laufen jedoch noch einige viele bugs drin sind. Man kann den code leider mit PB 3.92 nich mehr kompilieren da im code nocoh alte lib´s verwendet werden und diese noch nich auf 3.92 umgestellt wurdeb. es is einfachnur dazu gedacht das man sehen kann wie man daten senden und empfangen machen kann und das halt an einem beispiel eines chats. Bitte postet KEINE antworten von wegen geht nich zu kompilieren oder so da oben alles dazu gesagt is und das project super alt ist

so hier könnt ihr euch das laden Chat

P.s. bitte auch keine kommentare über den wüsten code der war nie dafür gedacht veröffentlicht zu werden!!!!!

Viel Spaß damit und vieleicht hilft es ja jemandem oder er will es umbauen das es in PB wieder zu kompilieren geht.

Verfasst: 08.02.2005 20:08
von Team100
@nicolaus

da steckt viel Arbeit drin und auch ne Menge drumherum
(bis hin zu den Smilies....). Super Ausgangsbasis zum Weitercoden :allright:

@stbi

zum Thema SendNetworkFile:

Der Befehl ist sicher sehr nützlich, jedoch denke ich daß er für kleinere
Dateien gedacht ist, deshalb auch das komplette Einlesen in das
Memory. Ein Hinweis im Handbuch darauf wäre nicht schlecht.....

Bei Dateien > 1MB macht das paketweise übertragen mit
SendNetworkData - ReceiveNetworkData Sinn. Zerlegt man bespielsweise
in 20 Pakete, hat das den Vorteil, damit auch einen Progressbar ansteuern zu können,
fehlerhafte Pakete nocheinmal zu senden, Prüfsummen zu rechnen, die Dateilänge
und den Dateinamen vorab zu übertragen etc.
Das alles kann ReceiveNetworkFile nicht.

Auch behaupte ich, daß das Dateiübertragen ohne Zwischenspeichern
nicht funktionieren wird, besonders wenn die Datei von einer CD/DVD,
Diskette etc. kommt, auch kann ja die Festplatte von einem anderen
Task beschäftigt sein. Leseverzögerungen von mehreren Sekunden (oft
viel mehr wenn eine CD an der Kippe zum Sondermüll ist) wirken sich
beim direkten Datensenden Richtung Netzwerk sicher nicht vorteilhaft aus....

Eigentlich sehe ich SendNetworkFile-ReceiveNetworkFile als kleine
Draufgabe in der NetworkLib für bequemes Versenden von Kleindateien,
für größere Dateien ist sie schon vom Funktionsumfang her nicht konzipiert

Cu von Team100

Verfasst: 08.02.2005 22:47
von netfreak
Warum Funktioniert diese Procedure nicht?

Code: Alles auswählen

Procedure dateisenden(datei.s, ConnectionID)
*bufferread = AllocateMemory(1000) 
ReadFile(0, datei)
laenge = Lof()

Repeat
ReadData(*bufferread, 128)

;Debug PeekS(*bufferread)
;FreeMemory(*bufferread) 
 SendNetworkData(ConnectionID, *bufferread, 128) 
Delay(1)
enddatei = Eof(0)

Until enddatei <> 0
Debug "fertig!"
EndProcedure

Hinweis: Ich Empfangen mit Hilfe der Procedure von dige!

mfg
netfreak

Verfasst: 09.02.2005 00:32
von Andre
@stbi: Ich habe die PM erhalten und Fred mit einer Beschreibung des Problems (SendNetworkFile => Problem mit größeren Dateien + 100% CPU-Last) informiert. Mal sehen, was er antwortet. 8)

Ehrlich gesagt vermute ich aber auch, dass Team100 mit seiner Erklärung (Verwendung von SendNetworkData bei größeren Dateien) Recht hat. Habe jedoch selber keinen Plan von Netzwerk-Programmierung... :wink:

Verfasst: 09.02.2005 05:59
von ChaOsKid
hi netfreak,

ich hab mich mal etwas mit dem code beschäftigt und das ist dabei herausgekommen:

Code: Alles auswählen

Enumeration 1 ; NETWORK
  #NW_FILE
EndEnumeration
;/
Procedure.l ReceiveNetworkFileEx(ClientID.l, Folder$, BufferSize.l)
  *mem = AllocateMemory(BufferSize)
  Repeat
    If NetworkServerEvent() = 2
      ReceiveLength = ReceiveNetworkData(ClientID, *mem, BufferSize)
      If init = 0
        If PeekB(*mem) = #NW_FILE
          OrgSize = PeekL(*mem + 1)
          Debug "Filegrösse: " + Str(OrgSize)
          File$ = PeekS(*mem + 5)
          Debug "Filename: " +  File$
          If Right(Folder$,1)<>"\"
            Folder$ + "\"
          EndIf
          FileNr = CreateFile(#PB_Any, Folder$ + File$)
          If FileNr = 0
            Debug "ReceiveNetworkFileEx Write Error"
            Break
          EndIf
          index = Len(File$) + 6
          init = 1
        Else
          Debug "kein #NW_FILE"
          Stop = 1
        EndIf
        If ReceiveLength > index
          UseFile(FileNr)
          WriteData(*mem + index, ReceiveLength - index)
          Size = ReceiveLength - index
        EndIf
      Else
        If ReceiveLength > 0
          UseFile(FileNr)
          WriteData(*mem, ReceiveLength)
          Size + ReceiveLength
        EndIf
      EndIf
      ;Debug "ReceiveNetworkFileEx writing: " + Str(Size)
      If Size = OrgSize
        Stop = 1
        result = 1
      ElseIf Size > OrgSize
        Debug "ReceiveNetworkFileEx Size Error"
        Stop = 1
      EndIf
    EndIf
    Delay(1)
  Until Stop
  FreeMemory(*mem)
  If FileNr
    CloseFile(FileNr)
  EndIf
  ProcedureReturn result
EndProcedure
;/
Procedure SendNetworkFileEx(ClientID.l, File$, BufferSize.l)
  FileNr = ReadFile(#PB_Any, File$)
  If FileNr
    *mem = AllocateMemory(BufferSize)
    Debug "starte transfer"
    Repeat
      If init = 0
        PokeB(*mem, #NW_FILE)
        PokeL(*mem+1, Lof())
        Name$ = GetFilePart(File$)
        PokeS(*mem+5, Name$)
        init = 1
        index = Len(Name$) + 6
        UseFile(FileNr)
        DataLength = ReadData(*mem + index, BufferSize-index) + index
      Else
        UseFile(FileNr)
        DataLength = ReadData(*mem, BufferSize)
      EndIf
      ;Debug "SendNetworkFileEx reading: " + Str(DataLength)
      If DataLength > 0
        SendLength = SendNetworkData(ClientID, *mem, DataLength)
        ;Debug "SendNetworkFileEx sending: " + Str(SendLength)
        If SendLength = -1
          Debug "SendNetworkFileEx Server Error"
          result = 0
          Break
        ElseIf SendLength < DataLength
          Debug "SendNetworkFileEx Serverpuffer Error"
          result = 0
          Break
        ElseIf SendLength = DataLength
          result = 1
        EndIf
      EndIf
      Delay(1)
    Until Eof(FileNr)
    CloseFile(FileNr)
    FreeMemory(*mem)
  EndIf
  ProcedureReturn result
EndProcedure
;/
Procedure DateiSenden() 
  Shared Filename$, BufferSize.l
  ConnectionID = OpenNetworkConnection("127.0.0.1", 9000)
  If ConnectionID
    If SendNetworkFileEx(ConnectionID, Filename$, BufferSize)
      Debug "fertig gesendet"
    Else
      Debug "SendNetworkFileEx error"
    EndIf
    CloseNetworkConnection(ConnectionID)
  EndIf
EndProcedure
;/
;/
;/
InitNetwork()
If CreateNetworkServer(9000)
  BufferSize = 100000
  Filename$ = OpenFileRequester("QuellDatei zum verschicken auswählen","c:\test","*.*", "*.*")
  DownloadFolder$ = PathRequester("Ordner für die empfangene Datei", "c:\temp")
  If Filename$ And DownloadFolder$ And GetPathPart(Filename$) <> GetPathPart(DownloadFolder$)
    CreateThread(@DateiSenden(),0)
    Repeat
      If NetworkServerEvent() = 1
        Debug "client verbunden, datei empfang starten"
        If ReceiveNetworkFileEx(NetworkClientID(), DownloadFolder$, BufferSize)
          Debug "fertig empfangen"
        Else
          Debug "ReceiveNetworkFileEx error"
        EndIf
        Quit = 1
      EndIf
      Delay(1)
    Until Quit
    CloseNetworkServer()
  EndIf
EndIf

Debug "Ende"
mfG
Tobi

Verfasst: 09.02.2005 22:43
von netfreak
DANKE für eure Hilfe!
Es geht jetzt!

Verfasst: 09.02.2005 22:54
von DataMiner
Auch von mir ein RIESEN DANKE an ChaOsKid!!!
GENAU das, was ich seit Tagen suche...

:allright:

Verfasst: 30.04.2006 15:16
von Joel
Ich möchte auch ein Programm programmieren womit man Daten versenden kann. Aber ich habe keine Ahnung wie ich dass programmieren soll :mrgreen: :D . Kannst du mir dass Programm mal bitte als pb-Datei schicken (über E-Mail), damit ich ein beispiel habe wie man soetwas programmiert?????