IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Comment envoyer et recevoir un fichier


Sujet :

Réseau C

  1. #1
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut Comment envoyer et recevoir un fichier
    Bonjour, je développe depuis deux mois une application client/serveur (pour le moment, le serveur ne gère qu'un unique client)

    Voilà comment se comporte mon logiciel :

    Serveur: L'administrateur du serveur envoi des commandes.
    Client: Le client reçoit et traite ces commandes.

    Voilà la liste (temporaire) des commandes :

    STAT_ON : Indique au client que le serveur est présent
    STAT_OFF : Indique au client que le serveur est absent
    ACT_IP : Demande au client d'envoyer toutes les infos (via : ipconfig ou iwconfig sur le réseau).
    ACT_SEEHD>repertoire : Demande au client d'envoyer sous forme de texte, l'arborescence d'un repertoire
    ACT_CLOSE : Ferme la connexion côté serveur et côté client
    Voilà un exemple de la commande qui me parait la plus importante :

    ACT_SEEHD>repertoire

    Serveur:
    com:> ACT_SEEHD>/home/samsoft/Programmes/
    Client X : C C++ Ariberion
    Maintenant passons au code de la boucle de traitement de commandes (partie 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
     
    do
    {
     
                            sock_err = recv(socketServeur, serveurMessage, (int) sizeof(serveurMessage) - 1, 0);
     
                            if(sock_err != SOCKET_ERROR)
                            {
                                    char  *p = NULL, *part2, strDir[] = "dir ";
     
                                    serveurMessage[sock_err] = 0;
     
                                    p = strtok(serveurMessage, sep);
                                    part2 = strtok(NULL, sep);
     
                                    fprintf(stdout, "\n\nDonne'e recue avec succes\n\n");
                                    fflush(stdout);
     
                                    if(strcmp(serveurMessage, "STAT_OFF")==0)
                                    {
                                        fprintf(stdout, "Serveur %d : Administrateur absent\n", socketServeur);
                                        fflush(stdout);
                                    }
                                    else if(strcmp(serveurMessage, "STAT_ON")==0)
                                    {
                                        fprintf(stdout, "Serveur %d : Administrateur present\n", socketServeur);
                                        fflush(stdout);
                                    }
                                    else if(strcmp(serveurMessage, "ACT_SEEHD")==0)
                                    {
                                        if(part2 == NULL)
                                        {
                                            fprintf(stdout, "ACT_SEEHD");
                                        }
                                        else
                                        {
                                            fprintf(stdout, "Commande : %s\n", strDir);
     
                                            char saveTo[] = ">hdData.txt";
                                            strcat(strDir, part2);
                                            strcat(strDir, saveTo);
                                            system(strDir);
     
                                            FILE *myFile0 = fopen ("hdData.txt", "r");
     
                                            if (myFile0 != NULL)
                                            {
                                                char line[256];
     
                                                while(fgets(line, sizeof line, myFile0) != NULL)
                                                {
                                                    send(socketServeur, line, strlen(line), 0);
                                                }
     
                                                fclose(myFile0);
                                            }
                                            else
                                            {
                                                fprintf(stdout, "Erreur lors de l'ouverture d'un fichier\n");
                                            }
                                        }
                                    }
                                    else if(strcmp(serveurMessage, "ACT_IP")==0)
                                    {
                                        #if defined (WIN32)
                                            system("ipconfig>ipData.txt");
                                        #elif defined (linux)
                                            system("ifconfig>ipData.txt");
                                        #endif
     
                                        FILE *myFile = fopen ("ipData.txt", "r");
     
                                        if (myFile != NULL)
                                        {
                                            char line[256];
     
                                            while(fgets(line, sizeof line, myFile) != NULL)
                                            {
                                                send(socketServeur, line, strlen(line), 0);
                                            }
     
                                            fclose(myFile);
                                        }
                                        else
                                        {
                                                fprintf(stdout, "Erreur lors de l'ouverture d'un fichier\n");
                                        }
     
                                    }
                                    else if(strcmp(serveurMessage, "ACT_CLOSE")==0)
                                    {
     
                                        int rsltOfShutdown = shutdown(socketServeur, 2);
     
                                        if(rsltOfShutdown != SUCCESS)
                                        {
                                            fprintf(stdout, "Erreur lors de la fin de connexion\n");
                                        }
                                        else
                                        {
                                            #if defined (WIN32)
                                                closesocket(socketServeur);
                                            #elif defined (linux)
                                                close(socketServeur);
                                            #endif
     
                                            fprintf(stdout, "Fermeture de la connexion avec le serveur :%d\n", socketServeur);
                                        }
                                        end = 0;
                                    }
                                    else
                                    {
                                        fprintf(stdout, "Serveur %d : %s\n", socketServeur, serveurMessage);
                                        fflush(stdout);
                                    }
                            }
                            else
                            {
                                fprintf(stdout, "Erreur lors de la re'ce'ption : ");
                                fprintf(stdout, "sock_err = %d\n\n", sock_err);
                                fflush(stdout);
                                end=0;
                            }
    }
    while(end!=0);
    Je sais comment envoyer et recevoir le contenu d'un fichier mais je ne vois pas du tout comment envoyer et recevoir un fichier.

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Je sais comment envoyer et recevoir le contenu d'un fichier mais je ne vois pas du tout comment envoyer et recevoir un fichier.

    Merci d'avance
    Tu n'envoies pas le fichier, mais son contenu. Le client est responsable ensuite de stocker les données reçues dans un fichier sur son propre système de fichiers.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Ah ca marche donc comme cela Je croyais qu'il y avait une fonctionne toute faite

    Le problème c'est que je ne vois pas comment faire avec ma méthode.

    J'ai un truc :

    Le serveur tape : ACT_SEND>/home/sam.txt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    com = strtok("ACT_SEND", ">");
    rep = strtok(NULL, ">");
    /* lecture du fichier */
    /* envoi */
    Partie serveur (pseudo code juste au dessus) c'est ok mais partie client, je ne vois pas comment il va pouvoir recevoir cela.

    Je veux dire comment va t'il savoir qu'il doit enregistrer ce qui arrive dans un fichier ?

    J'ai peut être une idée :

    Pour chaque cligne lue, je rajoutte devant :

    ACT_WRITE>sam.txt>contenu de la ligne

    Si c'est la dernière ligne je fais :

    ACT_WRITE>sam.txt>NULL

    Et j'envoi :

    Le 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
     
    com = strtok(donnée recue, ">");
    file = strtok(null, ">");
    txt = strtok(null, ">");
    if(strcmp(com, "ACT_WRITE")==0)
    {
    if(strcmp(txt, "NULL")==0)
    {
    fclose(file);
    }
    else
    {
    Écriture dans un fichier "file" en mode a+ (pour permettre la réécriture et non l'écrasement puis l'écriture)
    }
    }
    /* pseudo code */
    Je viens d'avoir cette idée, est elle correcte ? C'est pas une méthode de goret hein ? SI ? (ca en à l'air ! )

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 107
    Points : 122
    Points
    122
    Par défaut
    tu dois régler cela dans ton protocole client-server, exemple de session :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Client                                         Serveur
    -----------------------------------------------
    (SND_FILE|filename|size) -------> 
                            <----------------- (ACK)
    (contenu du fichier)          ------->
    Dans cette exemple, le protocole prévoit des messages de type texte dont les partie sont séparées par des caractères "|", explication :
    lorsqu'un message commence par SND_FILE le serveur sait que le client va envoyer un fichier, que le nom du fichier est situé après le pipe suivant, et qu'après le nom il y a la taille du fichier (ce qui permet de savoir quand arrêter de considérer les données reçues comme des données binaires)

    Il t'est ensuite possible de prévoir différents type de dialogue (ASK_FILE, etc).

    Une autre façon de procéder est d'avoir une socket spécialement pour la signalisation (init de connexion, demande de fichier, etc), et une socket pour l'envoi de données.

    Pour avoir des idées regarde les résumés de fonctionnement des protocoles existants (Http, ftp, SIP, etc).

  5. #5
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Merci c'est à peu près l'idée que j'ai eu sauf que je vais aussi ajouter la taille du fichier et voir ce que ca donne

    Je poste résolu

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Merci c'est à peu près l'idée que j'ai eu sauf que je vais aussi ajouter la taille du fichier et voir ce que ca donne

    Je poste résolu
    Avant de transmettre le fichier, tu es censé transmettre le nom, la taille, et éventuellement, la date, les droits etc.

    Regarde FTP ou TFTP. C'est très complet.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Ouai, le nom et la taille je le sais mais la date... Ca ne me sert pas.
    Je vais déjà voir ce que je peux faire avec mon idée et si c'est pas ca, je vais me renseigner

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment Envoyer et recevoir des mails en VBS
    Par lucke_widness dans le forum VBScript
    Réponses: 1
    Dernier message: 27/10/2009, 22h45
  2. Réponses: 1
    Dernier message: 22/04/2009, 23h43
  3. Réponses: 0
    Dernier message: 02/09/2008, 21h06
  4. Réponses: 9
    Dernier message: 04/06/2008, 11h38
  5. Envoyer et recevoir des fichiers aves les Sockets
    Par kaderscream dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/08/2006, 17h51

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