server kann keine datei empfangen wenn mehrere clienten da s

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag 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.
shutdown27
Beiträge: 15
Registriert: 28.08.2010 15:58
Kontaktdaten:

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag von shutdown27 »

wie mache ich das denn bei einem bild?
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag von jojo1541 »

In einen Empfangsbuffer schreiben und von dem aus in eine erstellte Datei.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
shutdown27
Beiträge: 15
Registriert: 28.08.2010 15:58
Kontaktdaten:

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag 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?
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag 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.
shutdown27
Beiträge: 15
Registriert: 28.08.2010 15:58
Kontaktdaten:

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag 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 :)
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag 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 ;)
shutdown27
Beiträge: 15
Registriert: 28.08.2010 15:58
Kontaktdaten:

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag 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
shutdown27
Beiträge: 15
Registriert: 28.08.2010 15:58
Kontaktdaten:

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag 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
Benutzeravatar
deify
Beiträge: 141
Registriert: 29.03.2010 22:01
Computerausstattung: Win7 64bit
AMD Phenom II X4 940
NVIDIA GeForce GTS 250
4GB RAM
Kontaktdaten:

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag 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?
Windows 7 | 64bit | PureBasic 4.51 (x64/x86)
Antworten