server kann keine datei empfangen wenn mehrere clienten da s
Re: server kann keine datei empfangen wenn mehrere clienten
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.
-
- Beiträge: 15
- Registriert: 28.08.2010 15:58
- Kontaktdaten:
Re: server kann keine datei empfangen wenn mehrere clienten
wie mache ich das denn bei einem bild?
Re: server kann keine datei empfangen wenn mehrere clienten
In einen Empfangsbuffer schreiben und von dem aus in eine erstellte Datei.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
-
- Beiträge: 15
- Registriert: 28.08.2010 15:58
- Kontaktdaten:
Re: server kann keine datei empfangen wenn mehrere clienten
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?
gibt es wirklich keine möglichkeit das es ordentlich normal funktioniert?
wenn nicht könnte mir jemand erklären wie das gennante funktioniert?
- 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
Ist doch in der Theorie ganz einfach:shutdown27 hat geschrieben: wenn nicht, könnte mir jemand erklären wie das genannte funktioniert?
- Du öffnest deine Datei, die du senden willst per ReadFile()
- Auf der Gegenseite erstellst du eine Datei per CreateFile()
- Nun Liest du die Datei via ReadData() stückchenweise ein und überträgst diese Stückchen via SendNetworkData().
- Auf der Gegenseite empängst du die Stückchen mit ReceiveNetworkData() und hängst sie mit WriteData() an deine Datei.
- Beide Seiten schliessen ihre Datei (CloseFile()) und du hast fertig.
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
-
- Beiträge: 15
- Registriert: 28.08.2010 15:58
- Kontaktdaten:
Re: server kann keine datei empfangen wenn mehrere clienten
danke habe das jetzt mal umgesetzt
und dabei kam das raus:
Client - Prozedur
Server der bereich wo er daten empfängt
irgendwie kommt aber nur müll raus aus einem 600KB bild
wurde ein 2,24 MB müllhaufen

liegt es an meinem code?
oder an was sonst?
danke für alle bemühungen ich weis das sehr zu schätzen
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
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)
wurde ein 2,24 MB müllhaufen

liegt es an meinem code?
oder an was sonst?
danke für alle bemühungen ich weis das sehr zu schätzen

- 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
Ja.shutdown27 hat geschrieben:[...]
liegt es an meinem code?
[...]
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.
Code: Alles auswählen
Structure
LengthOfData.l
KindOfPaket.w
*Data
EndStructure
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

{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
-
- Beiträge: 15
- Registriert: 28.08.2010 15:58
- Kontaktdaten:
Re: server kann keine datei empfangen wenn mehrere clienten
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
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
-
- Beiträge: 15
- Registriert: 28.08.2010 15:58
- Kontaktdaten:
Re: server kann keine datei empfangen wenn mehrere clienten
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:
funtzt ja auch sowas nur beim empfangen funktioniert es dann nicht
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
bitte helft mir mehr 
danke
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)
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
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

danke
- 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
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?
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?
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)

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)