![]() |
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 |
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 |
Re: Dateien per Server/Clientsocket versenden
Wofür braucht der Client denn die dateigröße in Bytes???
|
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.
|
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 |
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.
|
Re: Dateien per Server/Clientsocket versenden
Moin!
Zitat:
MfG Muetze1 |
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.
|
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:
|
Re: Dateien per Server/Clientsocket versenden
Zitat:
|
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^^??? |
Re: Dateien per Server/Clientsocket versenden
Zitat:
|
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: |
Re: Dateien per Server/Clientsocket versenden
Ich hab grad kein Delphi hier aber beim Client Formular:
Code:
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.
object IdTCPClient1: TIdTCPClient
MaxLineAction = maException ReadTimeout = 0 BoundPort = 669 Host = '127.0.0.1' Port = 0 Left = 8 Top = 8 end |
Re: Dateien per Server/Clientsocket versenden
Ja, BoundPort gibt den lokalen Port an, Port den Serverport. Vertausche die beiden Werte und es wird gehen.
|
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. |
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...
|
Re: Dateien per Server/Clientsocket versenden
Hat sich erledigt...danke erstmal
|
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? |
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?
|
Re: Dateien per Server/Clientsocket versenden
exakt. der socket kommt damit gar nicht klar. liegt sehr wahrscheinlich am client.
|
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