Winsock2 ungewöhnliche Ausgaben nach Datenversand!
-
{ char *daten = NULL; stat(file_name, &dataStat); daten = malloc(dataStat.st_size); while( read(handle, daten, sizeof(dataStat.st_size)) != 0) { printf("Daten[]: %s!\n", daten); rc = send(s, daten, sizeof(daten), 0); } }sizeof(daten) ist auf üblichen 32 bit system 4!!!
Ist das was Du willst? Vermutlich nicht.
-
simon.gysi schrieb:
@LØRdSe: Bist Du Tom?
Nein Tom ist mein bester Freund(natürlich rein platonisch)!
Und er ist nicht schwul nur jeder muss ein Opfer bringen!So bitte Back2Topic, ich würde das Problem gerne lösen!
-
werte doch mal die rückgabe werte der send(..) und recv(..) funktionen aus.. dann hättest Du bemerkt, dass da ein fehler mit sizeof(daten) sein muss...
benutzt du einen Debugger?
Simon
-
So bitte Back2Topic, ich würde das Problem gerne lösen!
Grundlagen lernen.
Simon
-
Nein ich benutze keinen Debugger!
Ich habe festgestllet das der Rückgabewert der Funktion recv() -1 ist!
Und deiner Meinung nach liegt das an dem sizeof(daten), allerdinsg habe ich das jetzt in:sizeof(dataStat.st_size);geändert!
EDIT:
Ich dachte recv(); ist ein Blocking Call allerdings gebe ich in meinem Server Programm den Rückgabewert der Funktion recv(); aus dieser wird allerdings schon ausgegeben bevor ich überhaupt eine Datei gesendet hab!
@Simon diese Antworten:
Grundlagen lernen!
halte ich für ziemlich unproduktiv!
Vielleicht würdest du mir mit dem funktionierendem Code-Schnipsel und einer kleinen Erklärung dazu viel mehr helfen!Also bitte setze es dochmnal fürmich um!
-
simon.gysi schrieb:
Grundlagen lernen.
Dem schließe ich mich an. Wenn du noch nicht mal "sizeof" verstehst, solltest du noch ein paar einfachere Anwendungen schreiben oder Tutorials durchackern.
-
1. Tip: Benutze den Debugger!
2.Ich habe festgestllet das der Rückgabewert der Funktion recv() -1 ist!
Und deiner Meinung nach liegt das an dem sizeof(daten), allerdinsg habe ich das jetzt in:Nein, das war nicht meine Meinung.
Ob recv(..) blocking ist oder nicht hängt übrigens mit dem Socket zusammen.
Bei Dir ist es allerdings blocking.recv(..) soll man in einer Schleife benutzen und den Rückgabe beachten!
Smion
-
Korrigiert mich wenn ich mich irre!
Aber eigentlich bin ich mir ziemlich sicher das sizeof() mir die Anzahl Bytes liefert die für eine Variable reserviert wird!Also was genau is das Problem?
Was mich stutzig macht:
Alleine dieser Code-Schnipsel produziert unsinnige Ausgaben:Client:
strcpy(file_name, "Hallo!"); send(s, file_name,6,0);Server:
rc= recv(acceptSocket, daten, 6, 0); printf("%s", daten);Da kann doch jetzt nix falsch dran sein!
-
LØRdSe schrieb:
Korrigiert mich wenn ich mich irre!
Aber eigentlich bin ich mir ziemlich sicher das sizeof() mir die Anzahl Bytes liefert die für eine Variable reserviert wird!Also was genau is das Problem?
Ja du liegst sowas von falsch des gibts gar net -> Beispiel:
char *test; printf("vor malloc:%i", sizeof(test)); //= 4 test = malloc(46214); printf("nach malloc:%i", sizeof(test)); //= 4 free(test); printf("ich habs doch gleich gesagt!");***
aber!***char doguggste[123]; printf("ach so:%i", sizeof(doguggste)); //= 123gib das mal ein und staune
-
Da hast Du allerdings recht.
Allerdings ist deine Variable ein Pointer (und dessen Grösse wird zurückgegeben, eben vermutlich 4).
Und der Pointer zeigt auf Memory, dessen Grösse aber der Programmierer verwalten muss.Für detailiertere Erklärungen schlage ich vor, dass Du mal bei MSDN nachliest.
Gruss Simon
-
Und wenn bei Fall 2 von doguggste die Variable (eine Array Variable) weitergereicht wird, dann geht sizeof wieder nicht so wie Du's gerne hättest...
Simon
-
Also bei dem Winsock Ding ist es ja so, daß oft u_char Strings gesendet und/oder empfangen werden. Wenn du sendest solltest du schon wissen was du sendest, also ist dir die Länge des SendStrings bekannt. Wenn du empfängst und die Daten in einem Buffer (z.B. Char array oder mit malloc zugewiesener Speicher) gespeichert werden weisst du nur am Rückgabewert von recv wieviele Daten wirklich empfangen wurden. Strlen oder ähnliches versagt da, weil du ja möglöicherweise Daten empfängst die auch gewollt '\x00' enthalten. Das ist im groben die Funktionsweise von send/recieve.
-
Was mich stutzig macht:
Alleine dieser Code-Schnipsel produziert unsinnige Ausgaben:Client:
strcpy(file_name, "Hallo!"); send(s, file_name,6,0);Server:
rc= recv(acceptSocket, daten, 6, 0); printf("%s", daten);Da kann doch jetzt nix falsch dran sein!
-
LØRdSe schrieb:
Was mich stutzig macht:
Alleine dieser Code-Schnipsel produziert unsinnige Ausgaben:Client:
strcpy(file_name, "Hallo!"); send(s, file_name,6,0);Server:
rc= recv(acceptSocket, daten, 6, 0); printf("%s", daten);Da kann doch jetzt nix falsch dran sein!
rc= recv(acceptSocket, daten, 6, 0); daten[rc] = '\0'; // <------------- printf("%s", daten);

-
rc= recv(acceptSocket, daten, 6, 0); daten[rc] = '\0'; // <------------- printf("%s", daten);Das bringt garnix außer ein weiteres kyrillisches Zeichen!
-
Zur Fehlereingrenzugn sende folgendes:
int test; test = send(s, "Hallo!",6,0);und werte erstmal test aus, wenn ok, dann Sender ok, wenn net dann net;
-
Rückgabewert ist mal wieder -1!
Warum?
-
winsock -> http://msdn.microsoft.com/en-us/library/ms741394.aspx
send(..) -> http://msdn.microsoft.com/en-us/library/ms740149.aspx
recv(..) -> http://msdn.microsoft.com/en-us/library/ms740121.aspxGuck doch mal was in der Doku zum return value steht...
Noch ein Hinweis:
Bei recv(..) ist es nicht zwinged so, dass Du alles auf einmal bekommst.
z.B. werden 6 Bytes gesendet, und empfangen werden einmal 4 Bytes und einmal 2 Bytes, das erkennst Du dann am return value.Simon