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 :

Envoi de fichier par socket


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut Envoi de fichier par socket
    Bonjour,
    après pas mal de recherche sur le net, je ne trouve rien sur l´envoi de fichier par socket. Pour l´instant j´ai 2 scripts ,1 coté serveur et l´autre coté client, et je peux simplement envoyer des messages du client vers le serveur.
    Pourriez vous m´aider svp ? mes connaissances en socket sont assez limités, ce sont des scripts déja faits ...

    Pour ceux que cela intéresse:

    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
    #include <stdio.h>      /* E/S standard: gets, printf, etc.                
    #include <string.h>     /* strlen etc. , memcpy                          
    #include <sys/types.h>  /* Divers designateurs de type                    
    #include <sys/socket.h> /* Sockets en general                              
    #include <netinet/in.h> /* Sockets du domaine Internet                  
    #include <netdb.h>      /* hostent, gethostbyname, gethostbyaddr          
    /**************************************************************************/
    #define nomhoteserveur "PC_Distant"
    #define portserveur 11111
    struct sockaddr_in adrserveur; /* Adresse du serveur */
    struct sockaddr_in adrclient; /* Adresse du client */
    int s; /* Numero socket */
    char message[100]; /* Tampon Donnees niveau application */
    struct hostent *h;
     
    /*************************************************
    *************************/
     
    void main()
    {
     
    /******************** CREATION DE LA SOCKET *****************************/
    if ( (s=socket(AF_INET,SOCK_STREAM,6)) == -1) /* 6 = numero protocole TCP*/
    { printf(">>> %s\n\n" , "Creation socket impossible" );
    exit(1);
    }
     
    /************** INITIALISATION DE L´ADRESSE DU SERVEUR ***************/
    adrserveur.sin_family = AF_INET;
    if ( (h=gethostbyname(nomhoteserveur)) == NULL )
    { printf("\n>>> %s\n\n" , "Nom hote serveur inconnu" );
    exit(1);
    }
    memcpy ( &adrserveur.sin_addr , h->h_addr , h->h_length );
    adrserveur.sin_port = portserveur;
     
    /******** DEMANDE DE CONNEXION ********************************************/
    if (connect(s,(struct sockaddr*) &adrserveur,sizeof(adrserveur)) == -1)
    { printf("\n>>> %s\n\n" , "Connexion au serveur impossible" );
    exit(1);
    }
     
    /******** EMISSION DU MESSAGE (bind automatique) ************************/
    while (1) /* Boucle sans fin, arret par control-C */
    {
     
    printf("|Message: " );
    gets(message); /* lit une ligne, scanf ne lit qu´un mot */
    if (write(s,message,strlen(message)+1) == -1)
    { printf("\n>>> %s\n\n" , "Emission du message impossible" );
    exit(1);
    }
    }
     
     
    exit(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
    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
    /**************************************************************************/
    /* Fichiers include <....>: consultables par pg ou cat dans /usr/include  */
    #include <stdio.h>      /* E/S standard: gets, printf, etc.               */
    #include <string.h>     /* strlen etc. , memcpy                           */
    #include <sys/types.h>  /* Divers designateurs de type                    */
    #include <sys/socket.h> /* Sockets en general                             */
    #include <netinet/in.h> /* Sockets du domaine Internet                    */
    #include <netdb.h>      /* hostent, gethostbyname, gethostbyaddr  
    /**************************************************************************/
    #define portserveur 11111
    struct sockaddr_in adrserveur; /* Adresse serveur */
    struct sockaddr_in adrclient; /* Adresse client */
    int lgadrclient = sizeof(adrclient);
    int s; /* Numero socket */
    int cli_sock; /* Numero socket client */
    int n; /* Nombre de caracteres lus */
    char message[100]; /* Tampon reception niveau application*/
    struct hostent *h;
     
    /*************************************************
    *************************/
    void main ()
    {
    /*********************** CREATION DE LA SOCKET D´IDENTIFIANT s **********/
    if ( (s=socket(AF_INET,SOCK_STREAM,6)) == -1 )
    { printf("\n>>> %s\n\n" , "Creation socket impossible" );
    exit(1);
    }
    /*********** LIEN DE LA SOCKET s A L´ADRESSE DU SERVEUR ******************/
    adrserveur.sin_family = AF_INET;
    adrserveur.sin_addr.s_addr = 0; /* 0.0.0.0 <---> adresse locale */
    adrserveur.sin_port = portserveur;
    if ( bind(s,(struct sockaddr*) &adrserveur,sizeof(adrserveur)) == -1 )
    { printf("\n>>> %s\n\n" , "Lien de la socket a l´adresse impossible" );
    exit(1);
    }
     
    /******** PASSAGE DE LA SOCKET EN ECOUTE PASSIVE *************************/
    printf("Attente de connexion \n" );
    /*pause(2);*/
    listen(s,10);
     
    /******** ACCEPTATION DE CONNEXION ***************************************/
    lgadrclient = sizeof(adrclient);
    cli_sock = accept(s,(struct sockaddr*) &adrclient,&lgadrclient);
    printf("Connexion etablie par le client:\n" );
     
    if ( (h=gethostbyaddr((char *) &adrclient.sin_addr.s_addr,
    sizeof(adrclient.sin_addr.s_addr),AF_INET)) == NULL)
    { printf("\n>>> %s\n\n" , "Nom hote client inconnu" );
    exit(1);
    }
    printf("|| %s %d\n" , h->h_name , adrclient.sin_port );
     
    /******** RECEPTION ET AFFICHAGE DES MESSAGES *************** ***********/
     
    while (1)
    {
    n = read(cli_sock,message,sizeof(message));
    if ( n == -1 )
    { printf("\n>>> %s\n\n" , "Lecture du message impossible" );
    exit(1);
    }
     
    printf("|| Client: %s %d\n" , h->h_name , adrclient.sin_port );
    printf("|| message: %s\n\n" , message);
    }
     
     
    }

  2. #2
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193

  3. #3
    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 dr_octopus74
    après pas mal de recherche sur le net, je ne trouve rien sur l´envoi de fichier par socket.
    Le transfert de fichier par sockets (ou autres) est un vieux problème résolu principalement par 2 protocoles : TFTP et FTP. En principe ton système dispose au moins de FTP, que ce soit pour faire un serveur (dftp ?) ou un client (ftp).
    A moins que ce soit une demande purement scolaire, il est inutile de réinventer la roue.

    http://man.developpez.com/man1/ftp.1.php

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut
    En fait c'est pour un projet d'informatique (donc scolaire), je cherche simplement a envoyer un fichier de clients (car ils sont plusieurs) vers 1 serveur qui centralise tout. Les 2 scripts donnés ci-dessus sont tous les 2 donnés par un prof, mai ils sont incomplets pour l'utilisation que je veux en faire.
    C'est pourquoi j'aimerais pouvoir les modifier pour envoyer simplement un fichier vers le serveur...
    Comme mes connaissances en socket sont presques nulles, je fais appel à une ame charitable pour pouvoir me sortir de ce probleme en modifiant mes scripts...

  5. #5
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Par défaut
    As tu lu le lien que j'ai mis ?
    parce qu'il est marque:
    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.
    il est aussi marque:
    send(descripteur,fichier,sizeof(fichier), 0); qui est a mettre la dedans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    printf("|Message: " );
    gets(message); /* lit une ligne, scanf ne lit qu´un mot */
    if (write(s,message,strlen(message)+1) == -1)
    { printf("\n>>> %s\n\n" , "Emission du message impossible" );
    exit(1);
    }
    }

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut
    merci pour ta réponse,
    j'ai lu le post de la meme personne qui donne une partie de son code source pour envoyer des fichier via socket
    http://www.developpez.net/forums/sho...ight=transfert
    Je vais y jeter un coup d'oeil,en essayant d'y integrer a mon script de départ.

    Mais deja il y a quelque chose que je ne comprend pas. A la compilation, il me dit
    error: 'get_recep' undeclared (first use in this function)

    pourtant j'ai bien
    int nb_recv = 0;
    char *get_recep[BUFSIZE];
    int nb_fcntl;
    while ( ( nb_recv = recv (socket_id, get_recep, sizeof(char), 0)) > 0)
    {
    fprintf(fichier_dst, "%s", get_recep);
    }
    fclose(fichier_dst);
    shutdown(socket_id, 2);
    close (socket_id);


    C'est le char qui pose probleme ??

  7. #7
    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 dr_octopus74
    char *get_recep[BUFSIZE];
    while ( ( nb_recv = recv (socket_id, get_recep, sizeof(char), 0)) > 0)
    Pourquoi un tableau de pointeurs sur char ? Un tableau de char est ce que tu veux, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            char get_recep[BUFSIZE];

Discussions similaires

  1. envoi/reception fichier par socket
    Par rezuz dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 19/06/2010, 16h52
  2. Envoi de Fichier par Socket
    Par devalender dans le forum WinDev
    Réponses: 2
    Dernier message: 20/06/2008, 12h59
  3. Envoie de fichier par socket
    Par eracius dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 05/10/2007, 11h21
  4. Envoi de fichier par socket
    Par thebloodyman dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 30/08/2007, 17h07
  5. [Débutant] Envoi de fichier par socket
    Par zapho dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 26/05/2004, 18h58

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