ERLEDIGT
NEIN
NEIN
ANTWORTEN
15
15
ZUGRIFFE
1581
1581
EMPFEHLEN
-
Hi,
Ich hab ein kleines Problem mit der funktion TransmitFile klick .
Also wenn ich die Funktion dazu verwende txt files oder anderes dieser Art, zu versenden klappt alles wunderbar. Aber wenn ich versuche eine exe zu versende dan kommt beim server irgenwie nix an ?
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
client : ... HANDLE hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL); ... if(TransmitFile(s, hFile, NULL, NULL, NULL, NULL, TF_DISCONNECT)) printf("Gesendet !"); else printf("nicht gesendet !"); server : ... ofstream datei("bla.exe", ios::binary); ... while(rc != SOCKET_ERROR) { rc = recv(connectedSocket, buf, sizeof(buf), 0); buf[rc] = '\0'; datei << buf; for(int i = 0; i <= 1024; i++) buf[i] = 0; } ...
Hat jemand ein kleines Beispiel für mich oder kann mir erklären wie es richtig geht
mfg progX
-
24.05.04 10:25 #2
- Registriert seit
- Jul 2003
- Ort
- Duisburg (NRW)
- Beiträge
- 1.788
Ich rate mal ins Blaue hinein: Ist vielleicht ein Firewall oder sonstiger Scanner im Weg, der ausführbare Dateien blockt?wenn ich versuche eine exe zu versende dan kommt beim server irgenwie nix an ?Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."
-
Das 100% nicht ! Sonst wäre überhaupt kein Socket erstellt worden und ich hätte keine txt files senden könnenIst vielleicht ein Firewall oder sonstiger Scanner im Weg, der ausführbare Dateien blockt?

Hat jemand ein kleines Beispiel für oder ein Link michwenn ich die Funktion dazu verwende txt files oder anderes dieser Art, zu versenden klappt alles wunderbar
mfg ProgX
Geändert von ProgX (24.05.04 um 12:37 Uhr)
-
24.05.04 12:43 #4
- Registriert seit
- Jul 2003
- Ort
- Duisburg (NRW)
- Beiträge
- 1.788
Schade. Ich habe ja gesagt, dass ich nur rate.Das 100% nicht ! Sonst wäre überhaupt kein Socket erstellt worden und ich hätte keine txt files senden können
@Kachelator: Dieter Nuhr hat da übrigens so einen Satz, den ich mir neben den Monitor pinnen sollte, damit ich immer dran denke: "Wenn man keine Ahnung hat, einfach mal die Fresse halten!"
Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."
-
Hat den niemand eine Lösung für mein Problem ?
-
sowas solltest du bei "Exes" vermeiden ! Exes könne an viele stellen Nullen haben also bringt das gar nichts ! Schau mal mit nem HexEditor was den Die Datei für anfangs bytes hat. Schon Debuggt wieveile Daten werden empfangen ?Code :
1
buf[rc] = '\0';
was ist buf und wie groß ist sizeof(buf)?
Was ist das ?Code :1 2
for(int i = 0; i <= 1024; i++) buf[i] = 0;
Wieso benutzt du nicht FILE_ATTRIBUTE_NORMAL. Was für dateien willst du den Versenden
Kannst du bitte den kompletten code posten, vielleicht kann man dir dann helfen.
@Kachelator : führst du schon selbst gespräche
-
24.05.04 19:37 #7
- Registriert seit
- Jul 2003
- Ort
- Duisburg (NRW)
- Beiträge
- 1.788
Und wie. Aber ich kann nichts dagegen machen. Bin so programmiert. Vielleicht wird es beim nächsten Patch besser.@Kachelator : führst du schon selbst gespräche
Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."
-
Danke für die Antwort hier der code. Ich habe es jetzt doch mit FILE und fopen gemacht.
Server :
Die ersten Byte der zu versendenen File sind ganz normal wie bei jeder exeCode :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
#include <windows.h> #include <winsock2.h> #include <iostream.h> int startWinsock(void); int main(void) { char ctext[1024]; long rc; char buf[1024]; SOCKET acceptSocket; SOCKET connectedSocket; SOCKADDR_IN addr; FILE *f = fopen("ttt.exe", "w+b"); rc = startWinsock(); if(rc != 0) { printf("Fehler : startWinsock, fehler code : %d\n", rc); return 1; } else { printf("Winsock gestartet !\n"); } acceptSocket = socket(AF_INET, SOCK_STREAM, 0); if(acceptSocket == INVALID_SOCKET) { printf("Fehler : Der Socket konnte nicht erstellt werden, fehler code : %d\n", WSAGetLastError()); return 1; } else { printf("Socket erstellt !\n"); } memset(&addr, 0, sizeof(SOCKADDR_IN)); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.s_addr = ADDR_ANY; rc = bind(acceptSocket, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)); if(rc == SOCKET_ERROR) { printf("Fehler : bin , fehler code : %d\n", WSAGetLastError()); return 1; } else { printf("Socket an port 12345 gebunden \n"); } rc = listen(acceptSocket, 10); if(rc == SOCKET_ERROR) { printf("Fehler : listen, fehler code : %d\n", WSAGetLastError()); return 1; } else { printf("acceptSocket ist im listen Modus....\n"); } connectedSocket = accept(acceptSocket, NULL, NULL); rc = recv(connectedSocket, buf, sizeof(buf), 0); buf[rc] = '\0'; fwrite(buf, rc, strlen(buf), f); fclose(f); return 0; } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2, 0), &wsa); }
(in heximal)
-------------------
4d 5a 50 00 02 00 00 00 04 00 0f 00 ff ff 00 00 b8 00 00 00 00 00 00 00 40 00 1a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 ba 10 00 0e 1f b4 09 cd 21 b8 01 4c cd 21 90 90 54 68 69 73 20 70 72 6f 67 72 61 6d 20 6d 75 73 74 20 62 65 20 72 75 6e 20 75 6e 64 65 72 20 57 69 6e 33 32 0d 0a 24 37 00 00 00 00 00
------------------
for(int i = 0; i <= 1024; i++)
buf[i] = 0;
Das sollte eingentlich den Puffer reinigen
Den Client hab ich dran gehängt (sonst wird das hier zu groß
)
mfg progX
-
sorry für den Doppelpost ich hab den Client vergessen
-
Ich habe jetzt den Client nicht angesehen, nur einen kurzen Blick auf den Server geworfen.
recv und auch send machen NIE einen grossen (>16 KB glaube ich) Klotz auf einmal. Du kannst auch je nach Verbindungsqualität mehrere verschieden grosse Pakete erhalten. Bei kleinen bekommst du meistens alles in einem Rutsch (zumindest lokal).
Tip: Sende vor dem File die Grösse des Files, damit der Server weiss, wann die Datei fertig ist. Prüfe auch, ob send wirklich alles weggesendet hat, evtl. musst du nämlich Einzelteile nachreichen.
Du musst bei recv prüfen, wieviel Bytes jetzt angekommen sind, und dann solange weiter recv-en, bis wirklich das gesamte File da ist (oder die Verbindung weg). In deinem Beispiel speicherst du das erste Paket das ankommt, und beendest dann. Was ist, wenn da noch mehr kommt?
-
Ich sende doch gar nicht mit send sonderen mit TransmitFilePrüfe auch, ob send wirklich alles weggesendet hat

Ich werde jetzt den recv-teil in eine while() schleife packen mal schauen ob es klappt.
[edit]
@Endurion
Du hattest doch recht ich glaube ich habe den Fehler gefunden. Es liegt am empfangenen Puffer. Ich sollte doch die Datei größe zuerst senden
Wie kann ich die Datei größe erhalten ?
[/edit]
mfg progX
Geändert von ProgX (25.05.04 um 13:05 Uhr)
-
Nur eine kleine Frage wie ist es möglich einen unsigned long über send zu versenden und ihn dan auch in gleicher form beim server zu erhalten ?
-
Schreib die Grösse in eine Variable (int oder Ähnliches),
schreib diese mit send rein, empfangen mit recv (zur Zeit ist int 32 bit gross, erspart mir Kommentare wie int kann aber unter Umständen...). Benutze sizeof, damit die Grösse nicht abweicht, aber sicherstellen, dass auf beiden Seiten sizeof dieselbe Grösse hat.
send( socket, (char*)&intVariable, sizeof( intVariable ), 0 );
-
Danke für die Antwort hat sich alles erledigt
-
25.05.04 18:30 #15
- Registriert seit
- Jan 2002
- Ort
- Bayern
- Beiträge
- 1.390
Für Datenarrays empfehle ich immer unsigned char[n] und nicht char[n].
Außerdem würde ein sizeof(buf) meißtens 4 zurückgeben (zumindest auf einem 32Bit System) da buf ja ein Zeiger ist und die Größe eines Zeigers 4 Byte hat. Also Vorsicht Falle !
Nein(zur Zeit ist int 32 bit gross, erspart mir Kommentare wie int kann aber unter Umständen...)
Das ist verdammt gefährlich, da man ja nicht weiß was die Gegenseite ist.Grösse nicht abweicht, aber sicherstellen, dass auf beiden Seiten sizeof dieselbe Grösse hat.
TCP/IP gibt es nicht nur unter Windows mit 32 Bit (Ok irgendwann mal 64 bit) sondern auch unter UNIX mit anderen Größen.
Ok ich weiß das Ganze ist nur für Windows gedacht, aber selbst wenn es dort mal "echte" 64bit gibt (soll ja kommen) dann darfst du das wieder umschreiben.
Gruß Homerwe would change the world if god gave us the source code...
and remember, science is nothing more than reverse engineering nature...
Current projects:
- LdrawConverter





Zitieren
Login






