Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Dateien per Server/Clientsocket versenden (https://www.delphipraxis.net/21056-dateien-per-server-clientsocket-versenden.html)

Neuni 27. Apr 2004 13:33


Dateien per Server/Clientsocket versenden
 
Hallo zusammen...folgendes Problem.

Ich hab hier im Forum schon geguckt, aber nur beispiele und themen bezüglich IdTCP gefunden...
mein Problem ist, dass Indy irgendwie nicht richtig läuft, und dass ich lieber Serversocket bzw. Clientsocket gebrauchen würde.
Hat jemand sowas schonmal gemacht, oder hat jemand ne Idee, wie man das ganze machen könnte?

Danke schonmal im vorraus

alcaeus 27. Apr 2004 13:55

Re: Dateien per Server/Clientsocket versenden
 
Ja, ich hab was gemacht, aber durch einen Festplattencrash gibts den code nicht mehr. In den Grundzügen habe ich es ohne Streams gelöst, also so:
Dateitransfer Server->Client
S=Server, C=Client

Hier eine Liste was gesendet wird
S: Dateigröße in Bytes
C: Ok
S: Sende Block <Nummer> mit <Größe> Bytes
C: Send
S: Daten
C: verifiziert Größe, falls Größe stimmt, Ok schicken, ansonsten Resend
S: Sendet im Notfall den Block nochmals, andernfalls geht er zum nächsten

Am Ende:
S: EoF
C:Ok

So müsste die Kommunikation gehen, die Daten kannst du mit SendBuffer senden, versuch mal, die Kommunikation aufzubauen, falls du Probleme hast helfe ich gerne

Neuni 27. Apr 2004 13:58

Re: Dateien per Server/Clientsocket versenden
 
Wofür braucht der Client denn die dateigröße in Bytes???

alcaeus 27. Apr 2004 14:01

Re: Dateien per Server/Clientsocket versenden
 
Um am Ende verifizieren zu können, dass alles gepasst hat, denn es könnte ja auch die Blockgröße durch einen Übertragunsgfehler geändert werden, dabei gehen zufällig auch noch die gleiche Anzahl Bytes verloren, und die Datei ist fehlerhaft. Laut Murphy ist dies alles möglich. Weiß der Client die Größe der Datei, kann er alles verifizieren.

Muetze1 27. Apr 2004 14:12

Re: Dateien per Server/Clientsocket versenden
 
Moin!

Ausserdem muss er ja wissen wieviel Bytes er aus dem Stream lesen muss bzw. erwarten kann - sonst weiss er ja nicht, wann Schluss ist...

MfG
Muetze1

alcaeus 27. Apr 2004 14:13

Re: Dateien per Server/Clientsocket versenden
 
Ja, das wäre die jeweilige Blockgröße, aber die Gesamtdateigröße muss am Ende mit der Summer der Blockgrößen zusammenstimmen, gleich wie die Blockgröße mit der Anzahl von Nutzbytes im Block übereinstimmen muss. Die Anzahl Bytes, die gelesen werden muss gibt mir auch das Socket zurück.

Muetze1 27. Apr 2004 14:21

Re: Dateien per Server/Clientsocket versenden
 
Moin!

Zitat:

Zitat von alcaeus
Die Anzahl Bytes, die gelesen werden muss gibt mir auch das Socket zurück.

Du meinst ReceiveLength - ja, ok. Aber damit weisst du immernoch nicht, wann Schluss ist. Auch das du die Datei in Blöcke unterteilst muss nicht sein, da die Blöcke meist eh nicht als ein solcher Block beim Empfänger ankommen sondern meistens noch weiter geteilt - und es gibt auch nirgends eine Garantie für die zusammenhängende Blöcke...

MfG
Muetze1

fiasko 27. Apr 2004 14:23

Re: Dateien per Server/Clientsocket versenden
 
Ähm, wozu nehmt ihr dann eigentlich noch das TCP-Protokoll? Das ist für die Transportsicherung zuständig und sorgt dafür das alles korrekt läuft. Wenn die Verbindung nicht abbricht kommt beim Empfanger alles genau so raus wie es der Sender reingeschickt hat. Die Serversocket sind aber nicht grad tolle Komponenten scheinen manchmal Müll zu machen, dafür würde ich lieber direkt die WinSock API ansprechen.

alcaeus 27. Apr 2004 14:24

Re: Dateien per Server/Clientsocket versenden
 
Ich habe das ganze einmal probiert, bei einer internet Blocklänge von mehr als 8 KB ging nichts mehr weiter..., 8KB war bei mir das Maximum, deswegen die Blöcke. Außerdem bist du als Anwendungsprogrammierer dafür zuständig, dass die Netzwerkkarte die Daten versandbereit enthält. Der Karte eine 100 MB-Datei vor die Füße werfen nenne ich nicht gerade versandbereit...:mrgreen:

fiasko 27. Apr 2004 14:30

Re: Dateien per Server/Clientsocket versenden
 
Zitat:

Zitat von alcaeus
Außerdem bist du als Anwendungsprogrammierer dafür zuständig, dass die Netzwerkkarte die Daten versandbereit enthält. Der Karte eine 100 MB-Datei vor die Füße werfen nenne ich nicht gerade versandbereit...:mrgreen:

Quark, da sind die Leute die den TCP-Stack geklaut haben dafür zuständig :gruebel:

Neuni 27. Apr 2004 14:31

Re: Dateien per Server/Clientsocket versenden
 
hmmm....wärs vielleicht doch einfacher mit indy???

Mein Problem mit Indy TCP ist halt nur:

Wenn ich nen Server aufmachen (Port: 669), dann öffnet der sich auch richtig, aber wenn ich dann mit nem Clienten connecte (Port:669 Host: 127.0.0.1), dann kann der client nicht connecten, und sagt:"Socket konnte nicht gebunden werden. Adresse und Port werden bereits benutzt."
Was heißt das^^???

fiasko 27. Apr 2004 14:38

Re: Dateien per Server/Clientsocket versenden
 
Zitat:

Zitat von Neuni
Was heißt das^^???

Das bedeutet einfach das der Port auf der Adresse schon offen ist. Machst du vielleicht einen 2. Listen Socket auf statt dich zu verbinden???

Neuni 27. Apr 2004 14:46

Re: Dateien per Server/Clientsocket versenden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmmm...keine Ahnung was ich falsch mache :cry:

Vielleicht kann sich das ja mal einer anschauen:

fiasko 27. Apr 2004 14:54

Re: Dateien per Server/Clientsocket versenden
 
Ich hab grad kein Delphi hier aber beim Client Formular:
Code:
  object IdTCPClient1: TIdTCPClient                                                                                                              
    MaxLineAction = maException                                                                                                                  
    ReadTimeout = 0                                                                                                                               
    BoundPort = 669                                                                                                                               
    Host = '127.0.0.1'                                                                                                                            
    Port = 0                                                                                                                                       
    Left = 8                                                                                                                                       
    Top = 8                                                                                                                                       
  end
ist bestimmt der BoundPort falsch. Das ist denke ich mal bei Indy der lokale Port. Der kann bei dir sicher 0 bleiben, was du setzen mußt ist die Eigenschaft Port.

alcaeus 27. Apr 2004 14:59

Re: Dateien per Server/Clientsocket versenden
 
Ja, BoundPort gibt den lokalen Port an, Port den Serverport. Vertausche die beiden Werte und es wird gehen.

Neuni 27. Apr 2004 15:14

Re: Dateien per Server/Clientsocket versenden
 
Jo, geht...danke!

Nur irgendwie geht das mit dem senden/empfangen nicht...guckt mal bitte was da nicht stimmt...die datei ist ja ^^OBEN^^ schon.

alcaeus 27. Apr 2004 15:15

Re: Dateien per Server/Clientsocket versenden
 
Beschreib mal genau was mit dem Senden/Empfangen nicht geht, ich habe nicht Lust (sorry), die Stecknadel im Heuhaufen zu suchen...

Neuni 27. Apr 2004 15:21

Re: Dateien per Server/Clientsocket versenden
 
Hat sich erledigt...danke erstmal

Manzoni 28. Apr 2004 18:45

Re: Dateien per Server/Clientsocket versenden
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi,

ich hab das ganze mal mit den standard sockets probiert. leider funzt es nur wenn man die fenster nicht bewegt :( weiss einer zufällig warum?

alcaeus 28. Apr 2004 18:47

Re: Dateien per Server/Clientsocket versenden
 
Was meinst du "die Fenster nicht bewegt"? Meinst du dass sobald sich das Fenster um ein Pixel nach links verschiebt die ganze Kommunikation zusammenbricht?

Manzoni 28. Apr 2004 18:51

Re: Dateien per Server/Clientsocket versenden
 
exakt. der socket kommt damit gar nicht klar. liegt sehr wahrscheinlich am client.

alcaeus 28. Apr 2004 18:54

Re: Dateien per Server/Clientsocket versenden
 
Seltsam...ich hab jetzt leider keine Zeit zum Testen, aber das Problem hatte ich noch nie....das Verschieben dürfte die Sockets an sich nicht beeinflussen


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz