1. #1
    Membre régulier

    Profil pro
    Inscrit en
    juin 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2009
    Messages : 81
    Points : 109
    Points
    109

    Par défaut Problème transfert .exe de linux a windows

    Bonjour, j'ai écris un programme qui transfert deux fichiers texte et un .exe de mon portable sous linux a ma tour sous windows10.
    Pour les deux fichiers texte l'opération se déroule sans aucun problème, par contre pour le .exe malgré que le poids soit bien le même, lorsque j'essaie de l'exécuter j'ai se message d'erreur :

    L'application n'a pas réussi à s'initialiser correctement (0xc0000005). Cliquez sur OK pour arrêter l'application.
    Alors quelques petites remarques. D'un l'exe est évidement compiler sous windows. De deux quand je teste le même programme avec une appli compilée elle sous linux et donc je transfert en local sous linux, le programme fonctionne parfaitement.
    Ensuite j'ai remarqué que le md5 du fichier a l'arrivée n'était pas le même que l'exe source, c'est peut là qu'est le problème, mais comment faire du coup ?

    Voila donc pour résumé : comment transférer un .exe compilé sous windows de linux a windows et que l'exe soit bien fonctionnel par la suite ?

    Merci a vous.
    A+++

  2. #2
    Membre éclairé Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2011
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mai 2011
    Messages : 355
    Points : 751
    Points
    751

    Par défaut

    Hello,

    Pour le transfert du .exe (et des .txt, aussi, pas de raison), as-tu bien ouvert les fichiers en mode rb et wb ?

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    juin 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2009
    Messages : 81
    Points : 109
    Points
    109

    Par défaut

    Oui j'ai bien ouvert les fichiers, enfin l'exe en mode binaire bien sur.

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    5 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 5 299
    Points : 22 493
    Points
    22 493

    Par défaut

    Comment a été compilé le programme et est-ce que les lib sont correctement installées ?
    Notamment si ça utilise les lib VS il faut les redistributable qui correspondent parfaitement à la version.
    En l'état c'est sûrement un problème de langage et non réseau.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    juin 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2009
    Messages : 81
    Points : 109
    Points
    109

    Par défaut Erreur de bleu

    Ahlalalalala l'erreur de bleu, j'ai honte.

    edgarjacobs m'a mit sur la piste j'avais effectivement ouvert le fichier exe en "rb" seulement (read seulement), j'ai modifié en "rb+" et magie ça fonctionne niquel.

    Désolé j'ai vraiment créer un sujet inutile, quoi que ça peut toujours servir a quelqu'un.

    Merci aussi a Bousk tu m'en apprend sur les lib je savais pas tout cela.

    Voila encore désolé j'aurais du me creuser la tête avant de foncer demander de l'aide , j'ai honte ......

    Merci a vous !

    A+++

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    juin 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2009
    Messages : 81
    Points : 109
    Points
    109

    Par défaut server envoie un peu trop de données !

    Re Bonjour, je me permet de ré ouvrir ce sujet car je rencontre un petit problème lors d'un transfert d'exe mais d'un gros fichier (+ de 100 Mo).

    Mon programme m'envoie coté server toujours (et c'est là mon problème ) un petit plus d'octets qu'il n'en faut.Pour être très précis, je dois envoyer un fichier d'un poid de : 134 681 725 octets.
    Le server m'envoie systématiquement 1006 paquets d'un total de 134 723 520 octets.Coté client bah rien d'anormal ça reçoit, ça écrit se que ça reçoit, rien d'extraordinaire. Donc je me retrouve avec un fichier de 134 723 520 octets au final.

    C'est comme si le server faisait un tour de boucle de trop, or je n'arrive pas , et c'est certainement un peu bête la solution, mais malheureusement je bloque a obliger le server a arrêter l'envoie au poid voulus.

    Je vous soumet code client , code server, c'est sous linux Ubuntu le tout est transmit en local.

    code server :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    //#include <sys/types.h>
    //#include <sys/socket.h>
    //#include <netinet/in.h>
    #include <arpa/inet.h>  //socket(), htons(), setsockopt(), bind(), accept(), shutdown() ...
     
    #include <stdio.h>  //printf() ftell()
    #include <stdlib.h>  //exit(), EXIT_FAILURE/EXIT_SUCESS
    #include <errno.h>
    #include <unistd.h>  // close()
    #include <string.h> // strerror(), meémset()
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(s) close (s)
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    #define PORT    1024
    #define MAXDATASIZE 133920
     
    #define ERROR(expression, fonction)  printf("Error : %s\nFonction : %s\nError Number : %d\nError Message : %s\n",\
                                    expression, fonction, errno, strerror(errno));
     
    void viderBuffer(char *buffer);
     
     
    int main(int argc, char*argv[])
    {
        SOCKET sock = 0;
        SOCKADDR_IN sin;
        socklen_t recsize  = sizeof(sin);
     
        SOCKET csock = 0;
        SOCKADDR_IN csin;
        socklen_t crecsize = sizeof(csin);
     
        FILE *exe = NULL;
     
        ulong poidExe = 0;
     
        int dataSend = 0;
        int totalSend = 0;
     
        int option = 1;
        int count = 1;
     
        char MsgAcceuil[64] = "Bonjour je suis HAL le server.Vous êtes maintenant connecté.\n";
        char bufferExe[MAXDATASIZE] = "";
     
     
        sock = socket(AF_INET, SOCK_STREAM, 0);
        if(sock == INVALID_SOCKET)
        {
            ERROR("socket()", "main()");
            exit(EXIT_FAILURE);
        }
     
        /* Contexte d'adressage du server */
     
        sin.sin_addr.s_addr = INADDR_ANY;
        sin.sin_family      = AF_INET;
        sin.sin_port        = htons(PORT);
        memset(sin.sin_zero, 0, 8);
     
        /* calcul du poid du fichier .exe */
        exe = fopen("VMware-Player-12.5.8-7098237.x86_64.bundle", "ab");
        if(exe == NULL)
        {
            ERROR("fopen()", "main()");
            exit(EXIT_FAILURE);
        }
     
        if(exe)
        {
            fseek(exe, 0, SEEK_END);
            poidExe = ftell(exe);
        }
     
        printf("le poids du fichier exe vaut %ld octets, soit %.6f Mo \n", poidExe, (double)poidExe / 1000000);
     
        fclose(exe);
     
        if(setsockopt(sock, SOL_SOCKET, (SO_REUSEPORT | SO_REUSEADDR), (char*)&option, sizeof(option)) == SOCKET_ERROR)
        {
            ERROR("setsockopt()", "main()");
            exit(EXIT_FAILURE);
        }
     
     
        if(bind(sock, (SOCKADDR*)&sin, recsize) == SOCKET_ERROR)
        {
            ERROR("bind()", "main()");
            exit(EXIT_FAILURE);
        }
     
        if(listen(sock, 5) == SOCKET_ERROR)
        {
            ERROR("listen()", "main()");
            exit(EXIT_FAILURE);
        }
     
        csock = accept(sock, (SOCKADDR*)&csin, &crecsize);
        if(csock == INVALID_SOCKET)
        {
            ERROR("accept()", "main()");
            exit(EXIT_FAILURE);
        }
     
        /* Envoie du message d'acceuil */
     
        if(send(csock, MsgAcceuil, strlen(MsgAcceuil)+1, 0) == SOCKET_ERROR)
        {
            ERROR("send()", "main()");
            exit(EXIT_FAILURE);
        }
     
        exe = fopen("VMware-Player-12.5.8-7098237.x86_64.bundle", "rb+");
        if(exe == NULL)
        {
            ERROR("fopen()", "main()");
            exit(EXIT_FAILURE);
        }
     
        /* Envoie du poid du fichier exe */
     
        printf("Poid devisier par 2 = %ld\n", poidExe);
     
        if(send(csock, (char*)&poidExe, sizeof(poidExe), 0) ==  SOCKET_ERROR)
            ERROR("send()", "main()");
     
        printf("PoidExe = %ld envoyé!!!\n\n", poidExe);
     
        while(totalSend < poidExe)
        {
            totalSend += dataSend;
     
            dataSend = send(csock, exe, MAXDATASIZE, 0);
            if(dataSend == MAXDATASIZE)
            {
                //printf("paquet normal N° %d : %d\n\n", count, dataSend);
            }
     
            if(dataSend < MAXDATASIZE && count < 1)
            {
                printf("permier paquet N° %d : %d\n\n", count, dataSend);
                break;
            }
     
            if(dataSend < MAXDATASIZE && count > 3)
            {
                printf("dernier paquet N° %d : %d\n\n", count, dataSend);
                break;
            }
     
     
            if(totalSend == poidExe)
            {
                printf("On sors !!\n");
                break;
            }
     
            if(dataSend == SOCKET_ERROR)
            {
                ERROR("send()", "main");
            }
     
            count++;
     
        }
     
        printf("Envoie de l'exe avec success !! \nTotal Send = %d\n\n", totalSend);
     
        sleep(2);
     
        shutdown(sock, 2);
        printf("Fermeture de la connection ...\n");
     
        close(sock);
        close(csock);
        fclose(exe);
        viderBuffer(bufferExe);
     
        return EXIT_SUCCESS;
    }
     
     
    void viderBuffer(char *buffer)
    {
        memset(buffer, 0, MAXDATASIZE);
    }
    Code Client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <unistd.h>
    #include <string.h>
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(s) close (s)
     
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    #define PORT    1024
    #define MAXDATASIZE 133920
    #define MAXTABSIZE   50000
     
    #define ERROR(expression, fonction)  printf("Error : %s\nFonction : %s\nError Number : %d\nError Message : %s\n",\
                                    expression, fonction, errno, strerror(errno));
     
    void viderBuffer(char *buffer);
     
     
    int main(int argc, char*argv[])
    {
        SOCKET sock = 0;
        SOCKADDR_IN sin;
        socklen_t recsize = sizeof(sin);
     
        long dataRecv = 0;
        ulong totalRecv = 0;
        int dataWrite = 0;
     
        int count = 1;
     
        ulong poidExe = 0;
        ulong bufferPoidExe[MAXTABSIZE] = {0};
     
        char buffer[MAXDATASIZE] = "";
     
        FILE *exe = NULL;
     
        sock = socket(AF_INET, SOCK_STREAM, 0);
        if(sock == INVALID_SOCKET)
        {
            ERROR("socket()", "main()");
            exit(EXIT_FAILURE);
        }
     
        /*contexte d'adressage du client **/
        sin.sin_addr.s_addr = inet_addr("127.0.0.1");
        sin.sin_family      = AF_INET;
        sin.sin_port        = htons(PORT);
        memset(sin.sin_zero, 0, 8);
     
        if(connect(sock, (SOCKADDR*)&sin, recsize) == SOCKET_ERROR)
        {
            ERROR("connect()", "main()");
            exit(EXIT_FAILURE);
        }
     
        /* Reception du message d'acceuil */
        if(recv(sock, buffer, MAXDATASIZE, 0) == SOCKET_ERROR)
        {
            ERROR("recv()", "main()");
            exit(EXIT_FAILURE);
        }
     
        printf("%s", buffer);
        viderBuffer(buffer);
     
        exe = fopen("VMware-Player-12.5.8-7098237.x86_64.bundle", "wb");
        if(exe  == NULL)
        {
            ERROR("fopen()", "main()");
        }
     
        /* Reception du poid du fichier exe */
     
        if(recv(sock, (char*)&bufferPoidExe, sizeof(poidExe), 0) == SOCKET_ERROR)
            ERROR("recv()", "main()");
     
        printf("Poid exe file reçut = %ld, poid exe = %ld\n", *bufferPoidExe, poidExe);
     
        do
        {
            dataRecv = recv(sock, buffer, MAXDATASIZE, 0);
            if(dataRecv == MAXDATASIZE)
            {
                dataWrite = fwrite(&buffer, sizeof(char), dataRecv, exe);
                //printf("paquet normal N° %d : %d\n\n", count, dataRecv);
            }
     
            if(dataRecv < MAXDATASIZE && count < 1)
            {
                dataWrite = fwrite(&buffer, sizeof(char), dataRecv, exe);
                printf("premier paquet N° %d : %ld\n\n", count, dataRecv);
     
            }
     
            if(dataRecv < MAXDATASIZE && count > 3)
            {
                dataWrite = fwrite(&buffer, sizeof(char), dataRecv, exe);
                printf("dernier paquet N° %d : %ld\n\n", count, dataRecv);
                break;
            }
     
            if(dataRecv == SOCKET_ERROR)
                ERROR("recv", "main");
     
            totalRecv += dataRecv;
     
            count++;
     
        }while(totalRecv < *bufferPoidExe);
     
        sleep(2);
     
        close(sock);
        fclose(exe);
        viderBuffer(buffer);
     
        printf("client closed\n");
     
        return EXIT_SUCCESS;
    }
     
     
    void viderBuffer(char *buffer)
    {
        memset(buffer, 0, MAXDATASIZE);
    }

    Merci pour votre aide.

    A++++

  7. #7
    Rédacteur/Modérateur

    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    5 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 5 299
    Points : 22 493
    Points
    22 493

    Par défaut

    Ton code est assez médiocre.
    Tu ne vérifies pas que ton premier envoi soit complet et ne transformes pas ton entier en network byte order.
    Tu balances exe en continu sans le décaller.
    exe n'est même pas l'ombre du contenu du fichier mais le FILE*.
    Tu fermes tes sockets après un simple sleep sans attendre d'accusé de réception de l'autre partie confirmant qu'il a bien tout reçu.
    viderBuffer à la fin est inutile, il est sur la stack et le programme va se terminer.

    Quant au client:
    Tu réceptionnes tout sans jamais vérifier les tailles.
    Ta réception du message d'accueil a toutes les chances de faire foirer tout le reste du programme vu qu'il n'est pas limité.

    Il y a un cours complet TCP (en C++ mais ce devrait être aisément applicable/portable en C) dispo dans ma signature que tu devrais commencer par lire.
    http://bousk.developpez.com/cours/re...-mini-serveur/
    http://bousk.developpez.com/cours/re...ecture-client/


    Faut aussi revoir la gestion de fichiers en C.
    L'envoi d'un fichier devrait au minimum ressembler à fopen, fread, send, send, fclose. La réception en mirroir devrait être connect, recv, fopen, recv, fwrite, fclose.
    Et vu que tu ne contrôles pas ce que TCP te retourne via recv, la séquence [recv, fwrite] se répètera sûrement.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    juin 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2009
    Messages : 81
    Points : 109
    Points
    109

    Par défaut

    Bon bah je vais corriger tout celà aucun soucis.

    Quand au code assez médiocre tu as sûrement raison, mais c'est dis d'une façon un peu dur je trouve, je ne fait pas d'étude d'informatique, je n'ai pas le gentil professeur qui viens reprendre mes erreurs et me guider dans un cours.Je suis débutant autodidacte, les 3/4 de tes réflexions je ne savais même pas qu'il fallait les faire :

    - Tu ne vérifies pas que ton premier envoi soit complet et ne transformes pas ton entier en network byte order (je ne savais pas qu'il fallait faire ça)

    - Tu balances exe en continu sans le décaller. (je ne sais pas ce que cela signifie, je vais chercher)

    - Tu fermes tes sockets après un simple sleep sans attendre d'accusé de réception de l'autre partie confirmant qu'il a bien tout reçu. (je ne savais pas qu'il fallait faire ça)

    - ect...

    Bref tes conseils sont très utiles et je t'en remercie mais cette petite phrase d'intro me démotive grandement et me fait un peu mal. Je fait ce que je peut et j'y met du mien je t'assure.
    Mais ne t'inquiété pas je ne suis pas en sucre , c'est pas ça qui va m'arrêter je vais y arriver a faire ce transfert.

    Merci pour les liens et les conseils je vais étudier tout ça.

    A++++

Discussions similaires

  1. Problème demarrage de Kali Linux et Windows XP
    Par GUYZOO dans le forum VirtualBox
    Réponses: 22
    Dernier message: 31/01/2017, 01h45
  2. problème portage ioctl socket Linux vers Windows
    Par progfou dans le forum Réseau
    Réponses: 19
    Dernier message: 06/10/2009, 19h44
  3. Réponses: 0
    Dernier message: 27/02/2008, 15h21
  4. Réponses: 1
    Dernier message: 10/02/2008, 08h27
  5. Problème connection à Linux sur Windows via Putty
    Par xionis dans le forum Réseau
    Réponses: 2
    Dernier message: 13/04/2007, 10h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo