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 :

transfert de fichier par un socket (codé en c) sous linux


Sujet :

Réseau C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 20
    Par défaut transfert de fichier par un socket (codé en c) sous linux
    Bonjour
    J'essaie de transférer des fichiers (de tout type : texte, exécutable,... et de toute taille : de qq centaines d'octets à 2 ou 3 Go) d'un ordi A à un ordi B (tous les 2 sous linux), en passant par le réseau local. J'emploie des sockets (de type TCP/IP, développés en C et compilés sous gcc) pour la communication; je parviens à transférer des messages, mais je n'arrive pas par contre à transférer des fichiers
    Quelqu'un saurait-il m'aider...merci pour votre aide

  2. #2
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Effectivement, ce message est mieux ici (dans le forum C). Tu peux peut-etre meme effacer l'autre.

    Sinon, qu'est-ce qui ne marche pas pour les fichiers ? Il ne sont pas complets ?

  3. #3
    Membre émérite
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Par défaut
    Bonjour,

    je ne vois pas le probleme.
    Tu envois tout d'abord la taille du fichier en octets (pour que client sache combien il devra lire d'octets).
    Ensuite, il te suffit d'envoyer le fichier par blocs.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 20
    Par défaut
    En fait, je fais un socket "Sock_stream" (transfert par flux) puis aprés je fais un send :
    send(descripteur,fichier,sizeof(fichier), 0);
    Mais je ne parviens pas à transférer "fichier" (je ne reçois pas le flux de données sur l'ordi serveur)...comment faire ?
    PS : pour fichier, c'est :
    FILE * fichier;

  5. #5
    Membre émérite
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Par défaut
    Citation Envoyé par Mickey34
    En fait, je fais un socket "Sock_stream" (transfert par flux) puis aprés je fais un send :
    send(descripteur,fichier,sizeof(fichier), 0);
    Mais je ne parviens pas à transférer "fichier" (je ne reçois pas le flux de données sur l'ordi serveur)...comment faire ?
    PS : pour fichier, c'est :
    FILE * fichier;
    Un FILE ne s'utilise pas comme cela. Tu dois lire le fichier a l'aide du FILE.
    Tu recuperes ainsi des données et tu les envois au fur a mesure.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 20
    Par défaut
    En effet, mais mon problème c'est que je n'ai pas que des dichiers textes à envoyer, il peut y avoir de tout (des images,...) Donc finalement il semblerait que je ne puisse utiliser des sockets pour ce genre de transfert. Je vais voir s'il n'y a pas un moyen simple de transférer des fichiers à partir d'une console Linux, comme ça je pourrai faire appel à SYSTEM dans mon code C pour le transfert
    Merci pour votre aide

  7. #7
    Membre émérite
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Par défaut
    Citation Envoyé par Mickey34
    En effet, mais mon problème c'est que je n'ai pas que des dichiers textes à envoyer, il peut y avoir de tout (des images,...) Donc finalement il semblerait que je ne puisse utiliser des sockets pour ce genre de transfert. Je vais voir s'il n'y a pas un moyen simple de transférer des fichiers à partir d'une console Linux, comme ça je pourrai faire appel à SYSTEM dans mon code C pour le transfert
    Merci pour votre aide
    Mais non. Tu peux tres bien envoyer n'importe quel fichier.
    Tu ouvres le fichier, tu lis et envois les données au fur a mesure.
    Ce n'est pas compliqué. Il faut juste envoyer avant la taille du fichier pour savoir quand le client doit s'arreter de lire la socket.

    Utilise les fonction open, read. Tu n'as pas besoin des FILE.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 20
    Par défaut
    Ca y est, j'arrive enfin à transmettre des fichiers textes par des sockets, mais je n'ai tj pas essayé avec des fichiers images, je le ferai bientôt et je vous tiendrai au courant
    Par contre j'ai encore un pb avec les sockets, pour changer...je voudrai envoyer une structure par la socket. Je fais un send (client) d'un coté et un recv (serveur) de l'autre. Le client envoie 7178 octets mais le serveur se borne à n'en recevoir que 1448. Comment faire pour tout recevoir ? voilà le 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
    typedef struct
    {
         char executeur[1024];
         char nb_input[10];
         char input1[1024];
         char input2[1024];
         char input3[1024];
         char output1[1024];
         char output2[1024];
         char output3[1024];
    } job;
    job job_en_cours;
     
    main...
    send(descripteur,&job_en_cours,sizeof(job),0);
    -----------------------------------------------
    serveur :
    ---------
    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
    typedef struct
    {
         char executeur[1024];
         char nb_input[10];
         char input1[1024];
         char input2[1024];
         char input3[1024];
         char output1[1024];
         char output2[1024];
         char output3[1024];
    } job_recu;
    job_recu job_a_traiter;
     
    main...
    recv(client_descripteur,&job_a_traiter,sizeof(job_recu),0);
    en fait je recois une partie seulement des infos (executeur et nb_input), le reste apparement n'a pas été reçu.
    Merci pour votre aide

    [Balises CODE ajoutees par GL]

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 60
    Par défaut Taille fichier
    Comment on fait pour connaitre la taille d1 fichier avant de le transférer?

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 71
    Par défaut
    sous windows tu as _filelength, ou sinon tu utilise fseek pour placer le pointeur à la fin du fichier et ftell ensuite...

  11. #11
    LFE
    LFE est déconnecté
    Membre Expert

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 95
    Par défaut
    Comment on fait pour connaitre la taille d1 fichier avant de le transférer?
    Merci de consulter la avant de poser des questions archi rebattues : http://lfe.developpez.com/FAQ/C/?pag...HIERS_filesize

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Août 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 20
    Par défaut
    les fonctions send et recv renvoient un entier : respectivement la taille du fichier envoyé et la taille du fichier reçu...
    Mais quelqu'un pourrait-il répondre à ma question ...please...je sèche !!!

  13. #13
    LFE
    LFE est déconnecté
    Membre Expert

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 95
    Par défaut
    Citation Envoyé par nyal
    je ne vois pas le probleme.
    Tu envois tout d'abord la taille du fichier en octets (pour que client sache combien il devra lire d'octets).
    Ensuite, il te suffit d'envoyer le fichier par blocs.
    Ca me semblre répondre tout à fait à ta question , non ?
    quel est le problème ?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Août 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 20
    Par défaut
    en fait mon problème maintenant, j'arrive à envoyer toute la structure (je suis en STREAM, mode connecté), du coté serveur je la reçois avec un recv (recv(client_descripteur,&job_a_traiter,sizeof(job_recu),0)). Quand je fais un : write(STDOUT_FILENO,&job_a_traiter,taille), il m'affiche toutes les infos les unes aprés les autres...mais je suis incapable d'attribuer les infos :
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sprintf(executeur,"%s",job_a_traiter.executeur);
            sprintf(nb_input,"%s",&job_a_traiter.nb_input);
            sprintf(input1,"%s",&job_a_traiter.input1);
    	...
    ma boucle principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    		while(1)
                   {
                        if ((taille=recv(client_descripteur,&job_a_traiter,sizeof(job_recu),0))==0)
                             break;    
                        if (taille<0)
                        {
                             perror("lecture ");
                             exit(1);
                        }
                        write(STDOUT_FILENO,&job_a_traiter,taille);
    		}
    [Balises CODE ajoutees par GL]

  15. #15
    Membre averti
    Inscrit en
    Avril 2002
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 53
    Par défaut
    Hello,

    tu peux le faire en passant d'abord par un char* que tu cast ensuite en un pointeur vers la strucutre voulu :

    exemple avec un strucutre point:

    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
     
    struct point
    {
        int x;
        int y;
    };
     
    ...
    struct point *p;
    char buf[1024];
     
    ...
    if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
            perror("recv");
            exit(1);
        }
     
     
        p = (struct point*)buf;
        printf("Received: %d %d\n",p->x, p->y);
    ....

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 30
    Par défaut hum
    pourquoi tu fait MAXDATASIZE -1 la je comprend pas trop..
    si tu fais M%AXDATASIZE ca marche normalement non?

    si quelqu'un peux m'expliquer je lui en serait reconnaissant

    cordialement

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Par défaut
    Citation Envoyé par Delgador
    pourquoi tu fait MAXDATASIZE -1 la je comprend pas trop..
    si tu fais M%AXDATASIZE ca marche normalement non?

    si quelqu'un peux m'expliquer je lui en serait reconnaissant

    cordialement

    je pense que est lié au fait qu'une chaine de caractéres est terminée par le caractère spécial Donc il réserve le dernier élément de la chaine( donc du tableau) pour ce caractère.
    Maintenant est ce que marche tout seul??
    je ne sais pas, à tester

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Mickey34
    les fonctions send et recv renvoient un entier : respectivement la taille du fichier envoyé et la taille du fichier reçu...
    Mais quelqu'un pourrait-il répondre à ma question ...please...je sèche !!!
    Non. Elles renvoient le nombre d'octets réellement émis. C'est différent (il y a un taille max de quelques centaines d'octets). Tu ne peux pas toujours envoyer le fichier en une fois. Il faut le lire par blocs (fread()) et l'envoyer par bloc (send() autant de fois que nécessaire. C'est de l'algorithmie de base... Une taille de bloc de 1024 devrait convenir dans tous les cas.

    Exemples pour un fichier texte :
    http://emmanuel-delahaye.developpez....reseaux-c/#LIV

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

Discussions similaires

  1. Transfert de fichier par socket client vers client
    Par Dasson dans le forum Entrée/Sortie
    Réponses: 21
    Dernier message: 17/04/2012, 02h26
  2. Transfert de fichiers par socket
    Par hebus44 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/10/2007, 13h55
  3. transfert de fichier par method post
    Par firejocker dans le forum Langage
    Réponses: 6
    Dernier message: 09/06/2006, 13h44
  4. Transfert de fichiers par sockets
    Par Kaori dans le forum C++
    Réponses: 19
    Dernier message: 26/01/2005, 13h58
  5. Transfert de fichier par ftp
    Par schub1015 dans le forum MFC
    Réponses: 3
    Dernier message: 14/01/2004, 17h53

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