Datei Empfangen (Prozessor auslastung zu hoch)!

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag 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.
Team100
Beiträge: 104
Registriert: 13.09.2004 22:59

Beitrag 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
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....
netfreak
Beiträge: 91
Registriert: 23.10.2004 18:30
Kontaktdaten:

Beitrag 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
mfg
netfreak
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
ChaOsKid
Beiträge: 66
Registriert: 29.08.2004 15:07
Wohnort: Oktoberfest

Beitrag 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
netfreak
Beiträge: 91
Registriert: 23.10.2004 18:30
Kontaktdaten:

Beitrag von netfreak »

DANKE für eure Hilfe!
Es geht jetzt!
mfg
netfreak
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

Auch von mir ein RIESEN DANKE an ChaOsKid!!!
GENAU das, was ich seit Tagen suche...

:allright:
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag 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?????
Antworten