tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
15
ZUGRIFFE
1581
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ProgX ProgX ist offline Mitglied
    Registriert seit
    May 2004
    Beiträge
    14
    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
     

  2. #2
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    wenn ich versuche eine exe zu versende dan kommt beim server irgenwie nix an ?
    Ich rate mal ins Blaue hinein: Ist vielleicht ein Firewall oder sonstiger Scanner im Weg, der ausführbare Dateien blockt?
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  3. #3
    ProgX ProgX ist offline Mitglied
    Registriert seit
    May 2004
    Beiträge
    14
    Ist vielleicht ein Firewall oder sonstiger Scanner im Weg, der ausführbare Dateien blockt?
    Das 100% nicht ! Sonst wäre überhaupt kein Socket erstellt worden und ich hätte keine txt files senden können
    wenn ich die Funktion dazu verwende txt files oder anderes dieser Art, zu versenden klappt alles wunderbar
    Hat jemand ein kleines Beispiel für oder ein Link mich

    mfg ProgX
    Geändert von ProgX (24.05.04 um 12:37 Uhr)
     

  4. #4
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Das 100% nicht ! Sonst wäre überhaupt kein Socket erstellt worden und ich hätte keine txt files senden können
    Schade. Ich habe ja gesagt, dass ich nur rate.

    @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."

  5. #5
    ProgX ProgX ist offline Mitglied
    Registriert seit
    May 2004
    Beiträge
    14
    Hat den niemand eine Lösung für mein Problem ?
     

  6. #6
    basd basd ist offline Mitglied Brokat
    Registriert seit
    Nov 2003
    Ort
    München
    Beiträge
    264
    Code :
    1
    
    buf[rc] = '\0';
    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 ?

    was ist buf und wie groß ist sizeof(buf)?

    Code :
    1
    2
    
        for(int i = 0; i <= 1024; i++)
            buf[i] = 0;
    Was ist das ?

    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
     

  7. #7
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    @Kachelator : führst du schon selbst gespräche
    Und wie. Aber ich kann nichts dagegen machen. Bin so programmiert. Vielleicht wird es beim nächsten Patch besser.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  8. #8
    ProgX ProgX ist offline Mitglied
    Registriert seit
    May 2004
    Beiträge
    14
    Danke für die Antwort hier der code. Ich habe es jetzt doch mit FILE und fopen gemacht.
    Server :
    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
    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);
    }
    Die ersten Byte der zu versendenen File sind ganz normal wie bei jeder exe
    (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
     

  9. #9
    ProgX ProgX ist offline Mitglied
    Registriert seit
    May 2004
    Beiträge
    14
    sorry für den Doppelpost ich hab den Client vergessen
    Angehängte Dateien Angehängte Dateien
     

  10. #10
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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?
     

  11. #11
    ProgX ProgX ist offline Mitglied
    Registriert seit
    May 2004
    Beiträge
    14
    Prüfe auch, ob send wirklich alles weggesendet hat
    Ich sende doch gar nicht mit send sonderen mit TransmitFile
    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)
     

  12. #12
    ProgX ProgX ist offline Mitglied
    Registriert seit
    May 2004
    Beiträge
    14
    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 ?
     

  13. #13
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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 );
     

  14. #14
    ProgX ProgX ist offline Mitglied
    Registriert seit
    May 2004
    Beiträge
    14
    Danke für die Antwort hat sich alles erledigt
     

  15. #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 !
    (zur Zeit ist int 32 bit gross, erspart mir Kommentare wie int kann aber unter Umständen...)
    Nein
    Grösse nicht abweicht, aber sicherstellen, dass auf beiden Seiten sizeof dieselbe Grösse hat.
    Das ist verdammt gefährlich, da man ja nicht weiß was die Gegenseite ist.
    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ß Homer
     
    we would change the world if god gave us the source code...
    and remember, science is nothing more than reverse engineering nature...

    Current projects:
    - LdrawConverter