Datei über Netzwerk versenden (Socket)
-
Die Übertragung klappt einwandfrei! (ich bevorzuge den Stream jedoch ohne Indy)
Nur wie erhalte ich den Pfad der kopierten Datei. Wenn ich eine Datei markiere und mit Strg+C kopiere, wird der Datei-Pfad in die Zwischenablage geschrieben (Überprüft mit Start -> Ausführen -> "clipboard.exe" -> Enter), Clipboard()->AsText liefert allerdings NULL, also nicht den erwünschten Pfad.Kurz:
Datei wird mit Strg+C kopiert. Wie bekomm ich den Pfad aus der Zwischenablage?mfg cb
-
Wie kann man den das was man mit
[int __fastcall SendBuf(void *Buf, int Count);]gesendet hat bei der ClientSocket Komponente den wieder empfangen
und speichern?
-
Hallo
Es gibt vermutlich einen analogen Event. Schau mal in die Builder-Hilfe oder die erwähnten Beispiele.
bis bald
akari
-
Hi,
das Gegenstück
Socket->ReceiveBuf(void *Buf, Count)habe ich gefunden, aber ich weiß damit nicht anzufangen
den diese Funktion liefert einen Integer Wert zurück.Kann mir da einer weiter helfen?
Ich poste mal etwas Quellcode, damit ihr sehen könnt was ich
bis jetzt habe:Server:
int iFileHandle; int iFileLength; // int iBytesRead; char *pszBuffer; if (OpenDialog1->Execute()) { try { iFileHandle = FileOpen(OpenDialog1->FileName, fmOpenRead); iFileLength = FileSeek(iFileHandle,0,2); FileSeek(iFileHandle,0,0); pszBuffer = new char[iFileLength+1]; // iBytesRead = FileRead(iFileHandle, pszBuffer, iFileLength); FileClose(iFileHandle); try { winsocket[0]->SendBuf(pszBuffer, iFileLength); } catch(...) { // fehler... } /* for (int i=0;i<iBytesRead;i++) { StringGrid1->RowCount += 1; StringGrid1->Cells[1][i+1] = pszBuffer[i]; StringGrid1->Cells[2][i+1] = IntToStr((int)pszBuffer[i]); } */ delete [] pszBuffer; } catch(...) { Application->MessageBox("Can't perform one of the following file operations: Open, Seek, Read, Close.", "File Error", IDOK); } }CLient:
int iFileHandle; int Count = 0; char *pszBuffer; Socket->ReceiveBuf(pszBuffer, Count); iFileHandle = FileCreate("C:\\FileFromServer.file"); FileWrite(iFileHandle, pszBuffer, Count); delete [] pszBuffer;Irgendetwas kommt an, aber was??
-
Deine Empfangsfunktion ist inkorrekt, du mußt natürlich erst mal Speicher bereitstellen:
const int Count = 1000; char *pszBuffer = new char[Count]; int nRead = Socket->ReceiveBuf(pszBuffer, Count); delete [] pszBuffer;Der Rückgabewert ist die Anzahl der gelesenen Bytes (oder -1 bei Fehler).
Nun das ganze noch in eine Schleife packen und den Puffer in eine Datei (oder einen Stream) schreiben und das war's dann schon.
-
Hi Th,
ich versteh leider nicht ganz was du mit der Schleife meinst.
Kann man den Inhalt des Buffers jetzt nicht einfach speichern?Könntest du mir ein Beispiel für die Schleife schreiben?
Gruß
Jeg
-
Wobei Du wenn ich mich noch recht entsinne es vorher so machen solltest
das Du als Text überträgst,TX -> RX
Vorsicht "File incomming"Dabei überträgst Du schon den Namen der Datei sowie die finale Dateigröße.
Dann fänsgt Du an den Stream zu übertragen.
Nun musst Du dir wohl oder übel ein kleines Protokoll schreiben.
Immerhin kannst Du nicht davon ausgehen das alle Daten immer
vollständig am Ziel ankommen. In der FAQ ist meines Wissens nach
ein netter Link zur Protokollentwicklung.
-
Hi,
ich hatte aber mal gerne gewusst wie ich die
Schleife realisiere um das so hinzubekommen
wie Th es beschrieben hat.Gruß
Jeg
-
Wenn Du 500000 Byte senden willst und jedes mal
1000 Byte ankommen, denke ich mal solltest Du solange
schreiben bis die 500000 Byte allesamt da sind würde
ich jetzt mal vermuten.
-
Hi Slashi,
das klingt logisch aber den Vorgang "Schreiben" hätte
ich gerne näher erläutern, ggf. ein Besipiel gesehen.Gruß
Jeg
-
Der Aufruf von SendBuf überträgt nicht wirklich die Daten übers Netz, sondern füllt zunächst nur die OS-internen Puffer. Das geht solange, bis die Puffer voll sind. Ist das der Fall (Rückgabewert auswerten!), muß gewartet werden, bis wieder Platz im Puffer ist. Das eigentliche Übertragen übernimmt dann das Betriebssystem. Du als Anwender hast keinen Einfluß darauf, in welcher Zeit und in welchen Blöcken das geschieht. Es ist lediglich sichergestellt, das alles vollständig und in der richtigen Reihenfolge ankommt. Das heißt, dass höchstwahrscheinlich mit jedem Aufruf von ReceiveBuf nur ein Teil deiner Datei ankommt. Du musst also die Datei stückenweise wieder zusammensetzen, bis alles vollständig angekommen ist. Wann das ist, dazu benötigst du ein Protokoll.
Rob'
-
Hi Rob,
vielen dank für deine Erläuterung.
Ich habe mir das anscheinend etwas zu leicht
vorgestellt. Werde mich also demnächst mal einer
intensiven Lektüre zu diesem Thema widmen.Gruß
Jeg