binare datei mit strings über socket senden
-
hallo, dieses beispiel kopiert eine binare datei per strings
in eine andere:#include <iostream> #include <string> #include <fstream> using namespace std; int main() { ifstream in_file("c:\\lol.mp3", ios::in | ios::binary); ofstream out_file("c:\\lol2.mp3", ios::out | ios::binary); string text; while(!in_file.eof()) { getline(in_file, text); out_file << text << endl; } in_file.close(); out_file.close(); }so nun wollte ich die strings mit
int size = str.size(); send (socket, (const char*)&size, sizeof(int), 0); send (socket, str.c_str(), size, 0);über einen socket senden, und mit
int size; char *str; recv (socket, (char*)&size, sizeof(int), 0); str = new char[size+1]; recv (socket, str, size, 0); str[size] = 0;wieder annehmen und wieder in eine datei schrieben. doch das hat
nicht geklappt da die neue datei größer war als die alte und somit
nicht abspielbar (mp3-datei).ist es denn richtig den string so zu senden und so wieder anzunehmen
oder soll ich etwas anders machen? danke schonmal für eure antworten!!
-
Hallo,
der Standard kennt keine Sockets.
Welches OS , welchen Compiler verwendest Du ?
-
recv liefert als rueckgabe die anzahl der gelsenen bytes.
du schreibst immer den kompletten buffer weg (->size was
die groesse deines buffers ist).int bytes = recv(...)
str[bytes]='\0'
-
schon mal gedebugged und geschaut, ob stringgröße richtig uebertragen wird, etc?
versuch malifstream in_file(...); in_file >> string;dann haste sicher ganze file im string. ich bin mir dann immer noch unsicher, was der mit '\0' macht. sobald du das im string drinstehn hast, müsste der aufhören weiterzulesen. also wenn deine datei:
4E FF 23 44 00 34 E3ist, dann steht im string nur die ersten 4 zeichen (beim auslesen). versuchs mal hardcode mit manuell allozierten char array und einem read statt getline. (also read(dateigröße) => buffer
-
hmm also ich benutzer windows und im moment noch den borland c++ 5.0
compiler.ehrlich gesagt habe ichd as nicht richtig verstanden! programmiere auch noch
nicht sehr lange! nehme ich denn mitint size; char *str; recv (socket, (char*)&size, sizeof(int), 0); str = new char[size+1]; recv (socket, str, size, 0); str[size] = 0;überhaupt einen string an?
-
du programmierst noch nicht lange, und arbeitest mit sockets?
-
du gehst im augenblick so vor: auf 2 happen sendest du 2 infos. naemlich beim erstenmal die laenge der zeichenkette, beim zweiten mal die zeichenkette selbst.
versuch mal das ganze zu debuggen. entweder mit nem debugger, oder per "printf-debug" alsorecv(...); cout << "size: " << size << endl; recv(...); cout << "string: " << buffer << endl;und kombinier das mal mit "normalen" strings statt dateien (zum testen)
-
sorry ich meinte das ich noch nicht lange mit sockets programmiere

also ich weis wie man mit ints eine binare datei über einen socket sendet.
und ich dachte das es mit strings genauso sei, das ich einfach den string
rübersenden und wieder in eine datei schreiben müsste. aber was genau hat
es mit diesem size und so auf sich?
-
Dieser Thread wurde von Moderator/in davie aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
naja, du verschickst halt string.size() bytes. es ist aber eh nicht ratsam, so große pakete zu schnüren. splitte lieber die datei in einzelhaeppchen a 100 byte oder so auf. diese nullterminierung (buffer[bytes] = '\0') is nur wichtig, wenn dein string nicht nullterminiert wäre. was aber in dem fall wurscht ist. versuch doch mal deinen netzwerkcode mit normalen strings, ob das klappt, wenn ja, liegt das problem wo anders (eben z.b. mit binärer null im string -> nicht weitergelsen).
string a = "hallo\n\0alles ab hier wird nicht mehr eingelesen"; a.c_str() muesste jetzt "hallo\n" sein