Seite 2 von 3

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 29.11.2010 20:52
von edel
Wieviel Dateien willst du denn aus einer machen? ReceiveNetworkFile laed doch schon die "ganze" Datei und speichert sie. HeX0R meinte das man nicht ReceiveNetworkFile benutzen sollte, warum auch immer, ich habe die Funktion noch nie benutzt. Versuch doch mal die Daten mit ReceiveNetworkData wieder einzulesen.

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 29.11.2010 21:06
von shutdown27
wie mache ich das denn bei einem bild?

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 29.11.2010 22:57
von jojo1541
In einen Empfangsbuffer schreiben und von dem aus in eine erstellte Datei.

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 02.01.2011 19:28
von shutdown27
ich stehe immernoch vor dem selben problem
gibt es wirklich keine möglichkeit das es ordentlich normal funktioniert?

wenn nicht könnte mir jemand erklären wie das gennante funktioniert?

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 02.01.2011 21:18
von HeX0R
shutdown27 hat geschrieben: wenn nicht, könnte mir jemand erklären wie das genannte funktioniert?
Ist doch in der Theorie ganz einfach:
  1. Du öffnest deine Datei, die du senden willst per ReadFile()
  2. Auf der Gegenseite erstellst du eine Datei per CreateFile()
  3. Nun Liest du die Datei via ReadData() stückchenweise ein und überträgst diese Stückchen via SendNetworkData().
  4. Auf der Gegenseite empängst du die Stückchen mit ReceiveNetworkData() und hängst sie mit WriteData() an deine Datei.
  5. Beide Seiten schliessen ihre Datei (CloseFile()) und du hast fertig.

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 03.01.2011 18:31
von shutdown27
danke habe das jetzt mal umgesetzt
und dabei kam das raus:
Client - Prozedur

Code: Alles auswählen


Procedure SendFileAsData(IDConnection,file$,waittime)  
  ;file$ = OpenFileRequester("Datei auswählen...","","Text (.txt)|*.txt|All files (*.*)|*.*",0)
  If ReadFile(0, file$) 
    Protected Length = Lof(0)                            ; Länge der geöffneten Datei ermitteln
    ;Debug Length
    Protected *MemoryID = AllocateMemory(length)         ; Reservieren des benötigten Speichers
    If *MemoryID
      Protected  DatenPacket=65535                       ; 65536 ;Legt Fest wie groß dein daten Paket sein soll
      Protected i
      For i=1 To Length/DatenPacket
        Protected bytes = ReadData(0, *MemoryID, DatenPacket)   ; Einlesen aller Daten in den Speicherblock          
        ;Debug PeekS(*MemoryID)
        SendNetworkData(IDConnection,*MemoryID,65535)
        Delay(waittime)
      Next
      ;Debug Length/DatenPacket
      ;FreeMemory(*MemoryID)
      If Length-Length/DatenPacket*DatenPacket>0
        Protected *MemoryIDDD=AllocateMemory(Length-Length/DatenPacket*DatenPacket)
        ;FillMemory(*MemoryID,Length-Length/DatenPacket*DatenPacket)
        bytes = ReadData(0, *MemoryIDDD, Length-Length/DatenPacket*DatenPacket)   ; Einlesen aller Daten in den Speicherblock
        ;Debug Length-Length/DatenPacket*DatenPacket
        ;Debug PeekS(*MemoryIDDD)
        SendNetworkData(IDConnection,*MemoryID,65535)
      EndIf
    EndIf
    CloseFile(0)
  EndIf

  FreeMemory(*MemoryID)
  FreeMemory(*MemoryIDDD)
EndProcedure 
Server der bereich wo er daten empfängt

Code: Alles auswählen

Case #PB_NetworkEvent_Data
          ReceiveNetworkData(ClientID, *Buffer, 65535)
          LastName=PeekS(*Buffer)
          PrintL(NameForID(ClientID)+": "+LastName)

          If Mid(LastName,1,2)="13"
            SendNetworkString(ClientID, "wait")
          ElseIf Mid(LastName,1,5)="FILE:"
            LastFile=Mid(LastName,6)
            CreateDirectory("C:\Users\Peter\Desktop\rofl\"+NameForID(ClientID))
            CreateFile(0,"C:\Users\Peter\Desktop\rofl\"+NameForID(ClientID)+"\"+LastFile)
          ElseIf Mid(LastName,1,5)="CLOSE"
            CloseFile(0)           
          Else
            WriteData(0,*Buffer,65535)
                
          EndIf
          ;FreeMemory(*Buffer)
          ;*Buffer=AllocateMemory(65535)
          FillMemory(*Buffer, 65535)
          
irgendwie kommt aber nur müll raus aus einem 600KB bild
wurde ein 2,24 MB müllhaufen
:D
liegt es an meinem code?
oder an was sonst?

danke für alle bemühungen ich weis das sehr zu schätzen :)

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 03.01.2011 20:22
von HeX0R
shutdown27 hat geschrieben:[...]
liegt es an meinem code?
[...]
Ja.

Ein paar weitere Hilfestellungen:
  • Immer den Rückgabewert von ReceiveNetworkData() benutzen!!11elf
  • Wenn möglich den Rückgabewert von SendNetworkData() benutzen.
    (Sobald du im LAN Dateien hin- und hersendest wirst du dort öfter auf eine blockierte Gegenstelle stossen und -1 als Rückgabewert erhalten)
  • Pakete müssen nicht (und werden auch eher selten) genau in der Größe bei dir ankommen, wie du sie losgeschickt hast.
  • Du solltest dir einen eigenen Header basteln, den du vor jedes zu sendende Paket hängst.
Z.B. sowas in der Art (sehr vereinfacht):

Code: Alles auswählen

Structure
  LengthOfData.l
  KindOfPaket.w
  *Data
EndStructure
Dann siehst du immer gleich am Anfang eines Pakets, wie lange es denn tatsächlich ist
und rufst solange ReceiveNetworkData() auf, bis dieses Paket komplett ist.
KindOfPaket kannst du benutzen, um verschiedene Paketarten zu unterscheiden.
Also z.B. 0 => *Data beinhaltet einen String [z.B. der Dateiname, der Datei, die gleich kommt]
1 => *Data beinhaltet Teile einer Datei.

Entschuldige, aber ich bin kein Freund von fertigen Lösungen.
Hättest du etwas angeboten, mit dem man arbeiten kann, ohne alles neu zu machen, sähe das anders aus.

Einfach weiter versuchen, oder hoffen, dass einem der anderen Fieselschweiflinge langweilig is ;)

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 03.01.2011 20:41
von shutdown27
könntest du mir ein wenig mehr sagen^^
ich habe schon sehr lange da oben an dem code gesessen und bin jetzt überfragt wie ich da die struktur einbringen soll
und was soll passieren wenn die übertragung fehlgeschlagen ist?
nochmal senden?

und richtig den grund warum es nicht funktioniert kenne ich immernoch nicht :P

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 02.02.2011 21:21
von shutdown27
sorry für den doppelpost
aber ich stehe IMMERNOCH vor dem problem ich bekomme es mittlerweile hin die Struktur zu senden aber ich kann sie an der gegenseite nicht verarbeiten
ich habe schon viel herumprobiert mit verschiedenen funktionen InitalizeStruct usw.

hier 2 code parts

der zum senden:

Code: Alles auswählen

*Send.SendStruct     = AllocateMemory(32100)
InitializeStructure(*Send, SendStruct)
*Send\Code="hi"
*Send\Nummer="du lord"
*Send\Data=234234
  Debug *Send\Code
  Debug *Send\Nummer
  Debug *Send\Data  
  SendNetworkData(ConnectionID,*Send,32100)    
funtzt ja auch sowas nur beim empfangen funktioniert es dann nicht

Code: Alles auswählen

*Buffer.SendStruct = AllocateMemory(32100);*Buffer.SendStruct = AllocateMemory(32100)
InitializeStructure(*Buffer, SendStruct)
;----------------------------------------------------;
;----------sonstiger code entfärnt----------------;
;----------------------------------------------------;
Case #PB_NetworkEvent_Data
          ;MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0)
          ;MessageRequester("Info", "String: "+PeekS(*Buffer), 0)
          Debug "Client "+Str(ClientID)+" has send a packet !"
          ;Debug "String: "+PeekS(*Buffer)
          ReceiveNetworkData(ClientID, *Buffer.SendStruct, 32100)
          
          Debug *Buffer\Code
          Debug *Buffer\Nummer
          Debug *Buffer\Data         
          
          *Receive.SendStruct  = AllocateMemory(32100)
          ;InitializeStructure(*Buffer, SendStruct)
          
          ;CopyStructure(@*Buffer, @*Receive, SendStruct)
          ;CopyMemory(*Buffer, *Receive, 32100)
          
          Debug *Receive\Code
          Debug *Receive\Nummer
          Debug *Receive\Data         
          
da funktioniert es manchmal aber es kommt nicht wirklich was an bleibt einfach nur leer
aber manchmal gibt es eine fehlermeldung er bricht einfach ab

ah und noch die struktur

Code: Alles auswählen

Structure SendStruct
  Code.s
  Nummer.s 
  *Data
EndStructure  
bitte helft mir mehr :)
danke

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 02.02.2011 22:57
von deify
würde mich jetzt auch als anfänger mal interessieren, ob dass den so überhaupt klappen kann?
ich habe selbst mal ein serverprogramm geschrieben, dass mit einer struktur für die pakete arbeitet... allerdings nicht so.

wie soll denn bitte DAS funktionieren?
SendNetworkData(ConnectionID,*Send,32100)
:o ich meine, so würde er doch nur die pointer-addresse verschicken oder? der client hat doch zu 100% komplett andere Daten an diesem Pointer, oder nicht?

Ich habe das damals so gellöst, dass ich eine Funktion structureToPaket(struct) und das passende gegenstück dazu programmiert hab. diese haben die structur eintrag für eintrag eingelesen und sie mit einem "Seperator" wie z.b. "//" in einen String gespeichert. Diesen habe ich dann gesendet und auf der anderen seite in eine neue Struktur eingefügt.

Geht das auch einfacher?