2010-12-01 10 views
1

Ich möchte Dateien (Text oder Binär) über winsock senden, habe ich einen Puffer mit 32768 Byte Größe, Auf der anderen Seite ist die Puffergröße gleich, aber wenn die Paketgröße < 32768 dann ich don ' t wissen, wie das Ende des Pakets im Puffer zu bestimmen, Auch mit Binärdatei scheint es das Ende des Pakets mit einem eindeutigen Zeichen ist nicht möglich, eine Lösung gibt es? thxDateiübertragung mit Winsock

Antwort

1

Mit "Paketen" fester Größe würden wir normalerweise jedes Paket außer dem letzten vollständig mit gültigen Daten voll sein. Nur der letzte wird "teilweise" sein, und wenn der Empfänger weiß, wie viele Bytes zu erwarten sind (weil Davitas Vorschlag dem Absender die Dateigröße im Voraus mitgeteilt hat), dann ist das kein Problem. Der Empfänger kann den Rest des letzten Pakets einfach ignorieren.

Aber Ihre weitere Beschreibung klingt wie es möglicherweise mehrere teilweise vollständige Pakete mit einer einzigen Dateiübertragung verbunden sind. Es gibt eine ähnlich einfache Lösung: Präfix jedes Paket mit der Anzahl der gültigen Bytes.

Sie später erwähnen TCustomWinSocket.ReceiveText, und Sie fragen sich, wie es weiß, wie viel Text zu lesen, und dann zitieren Sie die Antwort, die es ReceiveBuf(Pointer(nul)^, -1)) ruft, um die Länge des Ergebnispuffers vor dem Ausfüllen festlegen. Vielleicht hast du einfach nicht verstanden, was dieser Code macht. Es ist einfacher zu verstehen, wenn Sie sich die gleiche Code in einem anderen Kontext, der -Methode. Es macht denselben Aufruf an ReceiveBuf, anzeigend, dass wenn Sie -1 zu ReceiveBuf übergeben, es die Anzahl der Bytes zurückgibt, die es empfing.

Damit dies für Ihre Zwecke funktioniert, können Sie keine Pakete fester Größe senden. Wenn Sie immer 32KB-Pakete senden und das Ende nur mit Nullen auffüllen, gibt ReceiveLength immer 32768 zurück, und Sie müssen Davitas und meine Lösungen zum Senden von Datei- und Paketlängen zusammen mit der Nutzlast kombinieren. Wenn Sie jedoch sicherstellen, dass jedes Byte in Ihrem Paket immer gültig ist, kann der Empfänger basierend auf der Größe des Pakets wissen, wie viel zu speichern ist.

Auf die eine oder andere Art müssen Sie sicherstellen, dass der Absender dem Empfänger die Informationen zur Verfügung stellt, die er für seine Arbeit benötigt. Wenn der Absender Müll sendet, ohne dem Empfänger eine Möglichkeit zu geben, Müll von gültigen Daten zu unterscheiden, sind Sie festgefahren.

1

Nun, Sie können die Dateigröße immer senden, bevor Sie mit der Dateiübertragung beginnen, damit Sie wissen, wann Sie aufhören sollten, in die Datei zu schreiben.

+0

Ich werde es versuchen, ich suchte nach einer Lösung, um es auf der anderen Seite zu bestimmen, ohne Absenderseite zu ändern – joe500

+0

oh Auflegen, es ist nicht möglich, die Paketgröße vor dem Senden zu bestimmen, die SendBuff-Methode gibt die Nachricht nach dem Senden zurück Das Paket, auch ich habe versucht, das Paket auf der anderen Seite zu cpauter und warten auf die Paketgröße zu kommen, aber es wird zu komplex und scheint nicht möglich – joe500

+0

Die Socket.ReciveText bestimmen die Paketgröße und tatsächliche Daten, aber ich weiß es nicht wie => Funktion TCustomWinSocket.ReceiveText: Zeichenfolge; begin SetLength (Ergebnis, ReceiveBuf (Pointer (nil) ^, -1)); SetLength (Ergebnis, ReceiveBuf (Zeiger (Ergebnis) ^, Länge (Ergebnis))); Ende; – joe500