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

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 33
    Points
    33
    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 habitué 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
    Points : 139
    Points
    139

  3. #3
    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 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
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 33
    Points
    33
    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 habitué 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
    Points : 139
    Points
    139
    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
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 33
    Points
    33
    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 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 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];
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 33
    Points
    33
    Par défaut
    merci emmanuel, comme je l'ai dit + haut j'ai repris le code source d'une personne du forum qui avait le meme problème que moi. C'est un peu tendu, car il y a quelque instructions que je ne comprend pas. Je m'intéresse déja au script coté client (celui qui va téléchargé le fichier envoyé par le serveur)
    J'ai ça:
    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
     
    int debut, fin;
    FILE *fichier_dst;
            if (( fichier_dst = fopen (titre, "ab")) == -1)
            {
                    perror("fopen() ");
                    exit (-1);
            }
            int pos_depart, pos_fin;
            /* On se place a la fin ce qui mettra des 0 partout la ou */
            /* il y aura du vide                                      */
            if (pos_fin = fseek(fichier_dst, fin, SEEK_SET) == -1)
    {
                    perror("fseek() ");
                    exit(-1);
            }
            printf("On a mis a 0 jusqua le position: %d\n", pos_fin);
            /* On se met au debut du trou afin de remplacer les 0 */
            if (pos_depart = fseek(fichier_dst, debut, SEEK_SET) == -1)
            {
                    perror("fseek() ");
                    exit(-1);
            }
            printf("On se met a la position de depart: %d\n", pos_depart);
    /****************************************************/
            /* Envoie de la commande "/get " au serveur distant */
            /****************************************************/
            if ( send(cli_sock, cmd, sizeof(cmd), 0) == -1)
            {
                    perror("reception_liste> write()");
                    exit(1);
            }
    /*******************************************/
            /* Écoute de la socket et annalyse de ce   */
            /* qu'envoie le serveur.                   */
            /*******************************************/
    #define BUFSIZE 1024;
    	int nb_recv=0;
            char get_recep[BUFSIZE];
            while ( ( nb_recv = recv (cli_sock, get_recep, BUFSIZE, 0)) != 0)
            {
                            fwrite(&get_recep, sizeof(char), strlen(get_recep), fichier_dst);
            }
            fclose(fichier_dst);
            shutdown(cli_sock, 2);
            close (cli_sock);
    A ce que j'ai compris ,la valeur "titre" est le nom du fichier ? Mais fichier_dst c'est quoi alor ? pk mettre FILE *fichier_dst si juste apres on teste sa valeur ?
    Enfin, j'ai un erreur avec la variable "cmd" . Avec quel type de variable je dois déclarer cmd ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /****************************************************/
            /* Envoie de la commande "/get " au serveur distant */
            /****************************************************/
            if ( send(socket_id, cmd, sizeof(cmd), 0) == -1)

  9. #9
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    A ce que j'ai compris ,la valeur "titre" est le nom du fichier ?
    Plus que cela, c'est le chemin du fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mais fichier_dst c'est quoi alor ?
    C'est un pointeur sur un fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pk mettre FILE *fichier_dst si juste apres on teste sa valeur ?
    Afin de tester si l'ouverture de fichier a réussi ou non.

    Tu peux jeter un coup d'oeil sur le man de fopen!

    Enfin, j'ai un erreur avec la variable "cmd" . Avec quel type de variable je dois déclarer cmd ?
    Voici le prototype de send():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int send(int s, const void *msg, size_t len, int flags);
    mais souvent le type utilisé est un tableau de caractères!

    Voilà

  10. #10
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 33
    Points
    33
    Par défaut
    merci bcp pour tes explications.J'ai bien compris, sauf pour cmd. Il faut déclarer cmd comme ca : const void cmd ?
    Désolé mais étant donné que ce script est sur la machine qui DOWNload le fichier,je ne comprend pas l'interet d'envoyer le contenu de cette variable au serveur distant...
    je redonne juste le lien pour que vous comprenez un peu + le code de la personne qui l'a réalisé:
    http://www.developpez.net/forums/sho...d.php?t=224658

  11. #11
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 33
    Points
    33
    Par défaut
    J'ai aussi 2 autre soucis:
    1/ comment déclarer la variable titre comprenant le chemin du fichier a télécharger
    2/ en compilant j'ai une erreur qui me dit que la variable get_recep n'est pa declaré alors que juste au-dessus il y a: char get_recep[BUFSIZE];

  12. #12
    Membre habitué 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
    Points : 139
    Points
    139
    Par défaut
    Citation Envoyé par dr_octopus74
    merci bcp pour tes explications.J'ai bien compris, sauf pour cmd. Il faut déclarer cmd comme ca : const void cmd ?
    tu donnes l'adresse de cmd:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define MAXT 512
    char buf[MAXT] /* tampon pour la communication */
    snprintf(buf,MAXT,"Bonjour");
    send(f,buf,strlen(buf),0);
    Citation Envoyé par dr_octopus74
    Désolé mais étant donné que ce script est sur la machine qui DOWNload le fichier,je ne comprend pas l'interet d'envoyer le contenu de cette variable au serveur distant...
    c'est surement pour prevenir le serveur que le client est pret a recevoir les donnees. Quand le serveur recoit cette commande il commence a envoyer le fichier

  13. #13
    Membre habitué 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
    Points : 139
    Points
    139
    Par défaut
    Citation Envoyé par dr_octopus74
    J'ai aussi 2 autre soucis:
    1/ comment déclarer la variable titre comprenant le chemin du fichier a télécharger
    man fopen:
    FILE *fopen (const char *path, const char *mode);

    la variable titre est donc un tableau de caracteres:
    char titre[50];

  14. #14
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 33
    Points
    33
    Par défaut
    merci bcp semaj_james !!!
    ca commence à s'éclaircir un peu
    donc cmd est en fait un message ,donc une chaine de caractere ? (exemple: "serveur pret a envoyer les données")
    Cela donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define MAXT 512 
    char cmd[MAXT] /* tampon pour la communication */
    snprintf(cmd,MAXT,"serveur pret a envoyer les données");
    send(socket,cmd,strlen(cmd),0);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char titre[50]="\home\fichier.txt";
    c ca ?

  15. #15
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par dr_octopus74
    merci bcp semaj_james !!!
    ca commence à s'éclaircir un peu
    donc cmd est en fait un message ,donc une chaine de caractere ? (exemple: "serveur pret a envoyer les données")
    Cela donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define MAXT 512 
    char cmd[MAXT] /* tampon pour la communication */
    snprintf(cmd,MAXT,"serveur pret a envoyer les données");
    send(socket,cmd,strlen(cmd),0);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char titre[50]="\home\fichier.txt";
    c ca ?
    *
    Dans ton cas, l'utilisation de snprintf() ne me semble pas justifié, tu peux faire directement ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const char cmd[] = "serveur pret a envoyer les données";
    ou utiliser la fonction strncpy();

    De même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const char titre[]="\home\fichier.txt";
    De plus, il serait bien de tester la valeur de retour du send().


  16. #16
    Membre habitué 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
    Points : 139
    Points
    139
    Par défaut
    Citation Envoyé par dr_octopus74
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define MAXT 512 
    char cmd[MAXT] /* tampon pour la communication */
    snprintf(cmd,MAXT,"serveur pret a envoyer les données");
    send(socket,cmd,strlen(cmd),0);
    Citation Envoyé par homeostasie
    Dans ton cas, l'utilisation de snprintf() ne me semble pas justifié
    en effet, snprintf() s'utilise pour formater une chaine de caracteres. par exemple si tu veux envoyer la taille de ton fichier, tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define MAXT 512 
    int taille_fic=50;
    char cmd[MAXT] /* tampon pour la communication */
    snprintf(cmd,MAXT,"serveur pret a envoyer %d données",taille_fic);
    send(socket,cmd,strlen(cmd),0);
    c'est comme un printf sauf que tu l'ecris dans un tableau de caracteres
    Citation Envoyé par dr_octopus74
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char titre[50]="\home\fichier.txt";
    '\' est un caractere special:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char titre[50]="\home\fichier.txt";
    printf("\ntitre: %s\n\n",titre);
    donne:
    titre: home
    ichier.txt
    il faut donc mettre "\\" a la place de "\":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char titre[50]="\\home\\fichier.txt";
    printf("\ntitre: %s\n\n",titre);
    titre: \home\fichier.txt

  17. #17
    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 semaj_james
    '\' est un caractere special:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char titre[50]="\home\fichier.txt";
    printf("\ntitre: %s\n\n",titre);
    donne:
    Un comportement indéfini car "\h" n'est pas une séquence définie par la norme. Point. Ce que ça donne sur ta machine n'est qu'un cas particulier.

    Par contre, '\f' est défini (nouvelle page ou FORM FEED sur périphérique pour qui la notion de 'page' a un sens, comme un télétype ou une imprimante).

    Un compilateur correctement réglé

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    s'en serait aperçu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <stdio.h>
     
    int main (void)
    {
       char titre[50] = "\home\fichier.txt";
       printf ("\ntitre: %s\n\n", titre);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:5:16: warning: unknown escape sequence '\h'
    Linking console executable: C:\dev\forums2\console.exe
    Process terminated with status 0 (0 minutes, 6 seconds)
    0 errors, 1 warnings
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 33
    Points
    33
    Par défaut
    merci !
    la solution de semaj_james marche bien, sous windows comme sous linux.
    Il me reste encore des erreurs au niveau du get_recep,et à la fin pour la fermeture de la socket...
    :108: error: syntax error before ';' token recv.c
    :109: error: 'get_recep' undeclared (first use in this function) recv.c
    :109: error: (Each undeclared identifier is reported only once recv.c
    :109: error: for each function it appears in.) recv.c
    :109: error: syntax error before ';' token recv.c
    :114: error: syntax error before numeric constant recv.c
    :118: error: syntax error before '}' token

    je vous dispense des warning car yen a pas mal lol

    voici mon code coté machine qui download
    http://rafb.net/p/NyvtnQ36.html

    PS: get_recep[BUFSIZE] avec ou sans * c la meme chose

  19. #19
    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 dr_octopus74
    voici mon code coté machine qui download
    http://rafb.net/p/NyvtnQ36.html

    PS: get_recep[BUFSIZE] avec ou sans * c la meme chose
    • main() retourne int. Toujours.
      http://emmanuel-delahaye.developpez....s.htm#typemain
    • Pas de ';' dans une définition de constante avec #define.
    • Eviter assignation (=) et test (==) dans la même expression. C'est confusant et inutile avec un if() (mais parfois utile avec un while).
    • en cas d'erreur, fopen() retourne NULL et non -1.
    • Le type de get_recep est char et non char*.
    • fin et debut ne sont pas initialisées (non corrigé : comportement indéfini)

    Et évidemment, pour Windows, il manque WSAStartup etc.

    http://emmanuel-delahaye.developpez....#projet_reseau

    Ton code partiellement corrigé :
    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
     
    /**************************************************************************/
    /* SERVEUR MESSAGES (domaine Internet, mode connecte  , protocole TCP)    */
    /*                                                                        */
    /**************************************************************************/
    /* 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                           */
     
    /* compatibilite */
    #ifdef WIN32
    #include <winsock2.h>
    #else
    #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 closesocket(s) close(s)
    #endif
     
    /**************************************************************************/
    #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;
    /**************************************************************************/
    int main (void)
    {
     /*********************** 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);
      }*/
       const char cmd[100] = "serveur pret a envoyer les données";
       char titre[50] = "\\home\\fichier.txt";
       FILE *fichier_dst= fopen (titre, "ab");
       int debut, fin;
       if (fichier_dst  == NULL)
       {
          perror ("fopen() ");
          exit (-1);
       }
       /* On se place a la fin ce qui mettra des 0 partout la ou */
       /* il y aura du vide                                      */
     
       int pos_fin = fseek (fichier_dst, fin, SEEK_SET);
       if (pos_fin == -1)
       {
          perror ("fseek() ");
          exit (-1);
       }
       printf ("On a mis a 0 jusqua le position: %d\n", pos_fin);
       /* On se met au debut du trou afin de remplacer les 0 */
       int pos_depart = fseek (fichier_dst, debut, SEEK_SET);
       if (pos_depart == -1)
       {
          perror ("fseek() ");
          exit (-1);
       }
       printf ("On se met a la position de depart: %d\n", pos_depart);
       /* ************************************************** */
       /* Envoie de la commande "/get " au serveur distant   */
       /* ************************************************** */
       if (send (cli_sock, cmd, sizeof (cmd), 0) == -1)
       {
          perror ("reception_liste> write()");
          exit (1);
       }
       /* ***************************************** */
       /* Écoute de la socket et annalyse de ce     */
       /* qu'envoie le serveur.                     */
       /* ***************************************** */
    #define BUFSIZE 1024
       int nb_recv = 0;
       char get_recep[BUFSIZE];
       while ((nb_recv = recv (cli_sock, get_recep, BUFSIZE, 0)) != 0)
       {
          fwrite (&get_recep, sizeof (char), strlen (get_recep), fichier_dst);
       }
       fclose (fichier_dst);
       shutdown (cli_sock, 2);
       closesocket (cli_sock);
     
       return 0;
    }
    J'en suis là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:84: warning: 'debut' might be used uninitialized in this function
    main.c:84: warning: 'fin' might be used uninitialized in this function
    Linking console executable: C:\dev\forums2\console.exe
    Process terminated with status 0 (0 minutes, 3 seconds)
    0 errors, 2 warnings
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 33
    Points
    33
    Par défaut
    merci beaucoup ! j'avait rodé le ; apres le define qui coincait par contre les autres bien joué

    Je me suis maintenant attaqué au fichier d'envoi de donné (bon courage lol)

    voila mon code apres modif,
    http://rafb.net/p/rXMS7P63.html
    j'ai des erreur sur la variable buffer, le bzero est-il vraiment indispensable ?
    bzero - Ecrire des zéros dans un bloc d'octets.

    Si oui, Comment regler l'erreur ligne 61 svp ?
    :72: error: 'buffer' undeclared (first use in this function)
    :72: error: (Each undeclared identifier is reported only once
    :72: error: for each function it appears in.)
    :61: error: 'buffer' undeclared (first use in this function)
    :61: error: (Each undeclared identifier is reported only once
    :61: error: for each function it appears in.)

    Sinon j'ai une tout autre question, comment se fait il que j'ai ces erreurs en compilant avec devc++ ,alors que sous linux elle n'aparait pas ?
    25 `AF_INET' undeclared (first use in this function)
    pour la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( (s=socket(AF_INET,SOCK_STREAM,6)) == -1)
    j'aimerais pouvoir compiler sur windows, meme si ce script je dois m'en servir sous linux ,c'est lourd de devoir tout le temps redemaré sous linux pour tester. D'ailleur j'avai déja une erreur de ce type avec le script d'envoi
    16 invalid application of `sizeof' to incomplete type `sockaddr_in'
    pour la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int lgadrclient = sizeof(adrclient);
    j'ai essayé int lgadrclient = sizeof(struct sockaddr_in); mais rien

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