Winsock2 ungewöhnliche Ausgaben nach Datenversand!
-
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