socketfrage - dateiübertragung
-
hallo!
ich habe mir 2 programme geschriebn. einen socket-server ( sendet) und nen clienten ( empfängt). das ganze funktioniert mit einer nachricht schon gut, aber ich würde das gern auf dateiübertragung "upgraden".
wie mach ich das? mit ner schleife, die immer wieder sendet ? oder noch anders?
und muss der client dieselbe schleife haben? er muss ja das ganze mit nem stream wieder in eine datei bringen.ich brauch ( denke ich ) keinen code, sondern nur denkansätze xD
danke! da hok
-
Bist doch auf dem richtigen Weg

Der Sender müsste erst Bescheid sagen, dass er eine Datei schicken will. Dazu kann er gleich Infos wie Dateiname, Dateigröße, Päckchengröße oder so mitschicken. Der Empfänger gibt sein ok, daraufhin schickt der Sender Stück für Stück die Datei, am Ende braucht es vielleicht noch ein beidseitiges "OK", um die Übertragung zu bestätigen, dann ist alles in Butter
e: fast vergessen:
bitte! da bade

-
aukeii ( okay ( man hab ich ne langeweile xD ))
danke!
dann schreib ich das ma...
keine garantie das nich noch detailliertere fragen kommen

-
hallo nochma
char buf [256]; rc=recv(s,buf,255,0); if (rc == SOCKET_ERROR) { cout<<"Fehler beim emfangen"<<WSAGetLastError()<<endl; } else { cout<<"emfangen:"<<endl; } string b; for (int i = 0; i< 256;i++) { b.push_back(buf[i]); } cout<<b<<endl;bei der ausgabe kommt ( bis auf das empfangene ) natürlich nur müll raus.. kann ich das umgehn?
vllt buf als string? geht das? wenn ja wie?
-
Was für Daten sendest du denn? Text? Wenn ja, sende und empfange einfach das abschließende Null-Byte mit, dann kannst du "char buf[]" ganz normal wie einen String behandeln. Oder du schiebst den Inhalt in ein string-Objekt, kommt aufs gleiche raus

-
Das Einfachste ist es wenn man vorher die Länge mitschickt, wieviel Daten übertragen werden.
Und du solltest beachten dass wenn du 256 Bytes empfangen willst, nicht unbedingt 256 Bytes empfangen werden. Es können genausogut nur 1 Byte oder 10 oder 100 bis eben maximal 256 empfangen werden.Oder du bekommst eben SOCKET_ERROR zurück wenn ein Fehler aufgetreten ist, oder 0 falls der Socket am anderen Ende (für Senden) geschlossen wurde.
-
also, danke erstmal ( das hatte ich vergessen, sry)
also das mit der größe:
ich schick die größe, dann mach ich ne variable und dann erstell ich den buffer mit char buf [variable]
so hab ich des verstanden

das werd ich schoma so machenich wollte das eigentlich für sämtliche dateitypen machen. muss ich da noch was beachten???
greets da hok
-
Der Dateityp ist vollkommen egal, letztendlich ist es immer nur ein Haufen Bytes die in einem File drinstehen, und die musst du eben über die Socket Verbindung übertragen. Und am anderen Ende wieder in ein File schreiben.
Sonstige Dinge wie Dateiname etc. musst du evtl. auch mitschicken - kommt drauf an ob am anderen Ende der Original-Dateiname wiederhergestellt werden soll, oder ob der Empfänger einen Namen vergibt.
Genauso, falls du das originale Änderungsdatum/Erstellungsdatum oder auch Flags wiederherstellen willst, musst du diese Informationen auch mitschicken.p.S.: was es evtl. zu beachten gibt: wenn du die C-API verwendest (fopen/_open, fread/_read) musst du das File im "binary" mode aufmachen (auf beiden Seiten), sonst wird es nicht funktionieren - zumindest mit den meisten "nicht-Textfiles" nicht.