Datei senden
-
Bouncer, du bist einfach nur krank.
Felix15: ignoriere die Spam-Einträge von ihm einfach.
Es ist schon richtig, daß du für den Namen bzw. die Adresse eines TCP/IP-Servers ein char-Array mit ausreichender Länge benutzt.
"127.0.0.1", "localhost" oder "MySuperServer" passen einfach nicht in 4 Bytes...
-
Th schrieb:
"127.0.0.1", "localhost" oder "MySuperServer" passen einfach nicht in 4 Bytes...
na, wenn da text rein soll, dann hat die variable aber einen falschen namen.
-
Das hilft mir jetzt aber auch nicht viel weiter!
-
Felix: wo hast du denn jetzt noch konkrete Probleme?
-
Felix15 schrieb:
Das hilft mir jetzt aber auch nicht viel weiter!
hast du den link von ,,,,,,,,, beachtet?
ansonsten, hier mal zwei funktionen, die demonstrieren wie man alles restlos empfangen und senden kann. sind zwar für non-blocking sockets, aber das prinzip gilt ja auch so (das weiterzählen des pointers, etc.)static int RC_send_all (SOCKET sock, char *buff, int size) { while (size) { int res = send (sock, buff, size, 0); if (res == SOCKET_ERROR) { if (WSAGetLastError() == WSAEWOULDBLOCK) { // socket buffer full, let winsock suck it away Sleep (1000); continue; } // serious error or disconnected return -1; } size -= res; buff += res; } return 0; } static int RC_recv_all (SOCKET sock, char *buff, int size) { DWORD timeout = GetTickCount() + 5000; while (size) { int res = recv (sock, buff, size, 0); // Connection closed? --> exit if (res == 0) goto fail; // recv failed? else if (res == SOCKET_ERROR) { // No data? if (WSAGetLastError() == WSAEWOULDBLOCK) { // Timed out --> exit if (timeout < GetTickCount()) goto fail; // Retry Sleep(10); continue; } // Any other error (that is a real one) --> exit goto fail; } // Rx next chunk size -= res; buff += res; } // All Rx'd return 0; fail: return -1; }
-
Am Anfang der gesendeten Datei tritt ein Fehler auf:
Orginaldatei:
MZ ÿÿ ¸ @ € º ´ Í!¸LÍ!This program cannot be run in DOS mode. $ PE L –ä¼D å à 8 @ ` Ýë P Ø
empfangene Datei:
@ € º ´ Í!¸LÍ!This program cannot be run in DOS mode. $ PE L –ä¼D å à 8 @ ` Ýë P Ø
Irgendwie fehlen die ersten paar Bytes:
MZ ÿÿ ¸
Warum?
-
Ich hab's geschafft. Es war ein sleep zu wenig. Nach dem Senden der Größe muss beim Clienten ein sleep rein, dann empfängt der Server alles.
Danke für eure Hilfe,
Felix
-
Überträgst du denn vorher immer noch den Dateinnamen und kommt dieser richtig an, d.h. auch hier müßtest du vorher die Größe als int zuerst übertragen (oder aber immer ein konstantes Array - NICHT strlen(name)!!!)???
Edit: das mit dem Sleep() kann nicht die richtige Lösung sein (auch wenn es jetzt mal funktioniert, aber darauf kannst du dich bei Netzwerkübertragungen nicht verlassen)...
Du mußt schon auf Client und Server jeweils die exakt gleichen Daten senden und empfangen (und das machst du anscheined nicht, sonst würde es auch ohne Wartezeit funktionieren).
-
Th schrieb:
Du mußt schon auf Client und Server jeweils die exakt gleichen Daten senden und empfangen (und das machst du anscheined nicht, sonst würde es auch ohne Wartezeit funktionieren).
Dazu hätte ich eine Frage. Ich suche schon seit Ewigkeiten eine halbwegs vernünftige (und auch sichere) Version Dateien übers netzwerk zu versenden (Internet mit eingeschlossen.) Wie würde denn ein Beispiel aussehen wo man die Daten exakt empfängt oder gesendet bekommt? (Ohne Wartezeit Sleep)
Die Dateien müssen 100% ankommen, deswegen wäre ich an einer Version ohne die Wartezeit gerne interessiert, ich suche schon ne ganze Weile nach einem Tutorial welches das ganze mal übersichtlich aufzeigt. Aber finde irgendwie nix anständiges...
Komme irgendwie nicht weiter, und nochmal so ne blöde Frage am Schluss:
Muss man irgendwas beachten um binäre Dateien zu verschicken? Bei TextDateien und so... hat es halbwegs vernünftig geklappt aber bei binären Dateien sah ich alt aus...
P.s. Die Dateien werden richtig eingelesen und auch über buffer verschickt, darauf habe ich geachtet.
Wäre für Hilfe sehr dankbar, wie gesagt dieses Thema macht mich noch verrückt.
-
Nicht, dass es hier falsch verstanden wird bzgl. der Sleep()-Funktion.
Ich meine, man braucht kein Sleep() in der normalen Sende- bzw. Einleseschleife. Dagegen kann ein Sleep() bei einem möglichen SOCKET_ERROR Sinn machen (Timeout, Connection lost, etc.), aber dann sollte man eher versuchen die Verbindung noch mal neu auzubauen.Bei binären Daten muß man nur wissen, daß es eben kein Endekennzeichen gibt (da alle 256 char-Werte Daten sind). Somit überträgt man am besten im Voraus die Anzahl (z.B. als unsigned long), damit der Empfänger einen entsprechenden Hinweis auf die Datenlänge hat (um einen Puffer zu allokieren und nur genau so viele Daten anzufordern, wie angegeben wurden).