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:
- 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.
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

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)

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?