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 :

Envoyer un fichier de plusieurs lignes via socket


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 10
    Points
    10
    Par défaut Envoyer un fichier de plusieurs lignes via socket
    Bonjour,

    J'écris actuellement un programme me permettant d'envoyer le contenu d'un fichier par sockets C. Je précise que ce fichier comporte plusieurs lignes. Mon programme fonctionne correctement, mais il n’envoie que la dernière ligne du fichier !

    Le code est le suivant:

    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
     
    #include <sys/types.h> //différentes librairies
    #include <sys/socket.h> 
    #include <netinet/in.h> 
    #include <arpa/inet.h> 
    #include <netdb.h> 
    #include <stdio.h> 
    #include <unistd.h> 
    #include <string.h> /* memset() */ 
    #include <sys/time.h> /* select() */ 
    #define TAILLE_MAX 1000
     
    #define REMOTE_SERVER_PORT 50000 //on utilise ici le port 50000
     
    int main(void) 
    { 
       //déclaration des variables
       char *buffer; 
       int sock, rc, i; 
       struct sockaddr_in cliAddr, ServAddr; 
       int taille = 100; 
     
    FILE* fichier = NULL;
        char chaine[TAILLE_MAX] = "";
     
        fichier = fopen("plop.txt", "r");
     
    printf("Données envoyées:");
     
        if (fichier != NULL)
        {
            while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
            {
     
    	printf("%s", chaine); // On affiche la chaîne qu'on vient de lire
            }
             fclose(fichier);
        }
     
     
       //initialisation du buffer
    buffer = (char *) malloc(sizeof(char) * taille); 
    buffer = "ça marche !!!!!!"; //message envoyé au serveur
     
    printf("les données ont été envoyées\n"); //simple texte pour la lisibilité du programme
     
       //initialisation de la socket
       ServAddr.sin_family = AF_INET; 
       ServAddr.sin_port = htons(REMOTE_SERVER_PORT); 
       ServAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
     
       //création de la socket
       sock = socket(AF_INET,SOCK_DGRAM,0); 
     
       //initialisation de la socket
       cliAddr.sin_family = AF_INET; 
       cliAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
       cliAddr.sin_port = htons(0); 
     
       rc = bind(sock, (struct sockaddr *) &cliAddr, sizeof(cliAddr)); //bind
     
       //envoi du message
       rc=sendto(sock ,chaine, taille, 0, (struct sockaddr *)&ServAddr, sizeof(ServAddr)); 
     
       return 1; 
    }
    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
     
    #include <sys/types.h> //différentes librairies
    #include <sys/socket.h> 
    #include <netinet/in.h> 
    #include <arpa/inet.h> 
    #include <netdb.h> 
    #include <stdio.h> 
    #include <unistd.h> /* close() */ 
    #include <string.h> /* memset() */ 
     
    #define LOCAL_SERVER_PORT 50000 //on utilise ici le port 50000
     
    int main(void) 
    { 
       //déclaration des variables
       int sock, rc, n, cliLen; 
       struct sockaddr_in cliAddr, servAddr; 
       char msg[1000]; 
     
       //création de la socket
       sock=socket(AF_INET, SOCK_DGRAM, 0); 
     
       //initialisation de la socket
       servAddr.sin_family = AF_INET; 
       servAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
       servAddr.sin_port = htons(LOCAL_SERVER_PORT); 
       rc = bind (sock, (struct sockaddr *) &servAddr,sizeof(servAddr)); 
     
       //création d'une boucle infinie
       while(1) 
    	{    
    	//initialisation du buffer
    	memset(msg,0x0,100); 
     
        //pour la réception du message
        cliLen = sizeof(cliAddr); 
        n = recvfrom(sock, msg, 100, 0, (struct sockaddr *) &cliAddr, &cliLen); 
     
        //affichage du message reçu
        printf("Message recu : \n");
        printf("%s \n",msg); 
     
        }//fin de la boucle infinie
     
    return 0; 
    }
    Que dois-je changer pour envoyer TOUTES les lignes de mon fichier au serveur ?
    Merci par avance.
    Simon

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Problème résolu via l'utilisation d'un "fread".

  3. #3
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Je me suis arrêté sur ceci (je n'ai pas vu la suite du code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <...>
    while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
    {
     
    printf("%s", chaine); // On affiche la chaîne qu'on vient de lire
    }
    <...>
    À chaque tour de boucle tu écrases la chaîne précédemment lu, à la sortie de la boucle tu n'obtiens donc que la dernière ligne, il faut revoir ton algorithme.

    Citation Envoyé par simondu43 Voir le message
    Problème résolu via l'utilisation d'un "fread".
    Dire que c'est résolu est inutile si tu ne fournis pas la solution.

    Bon courage.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Tu ne l'as pas demandé, mais je me permets plusieurs remarques :

    Tu devrais compiler avec les warning, car au moins pour le client, il te manque un include et une variable ne sert à rien.

    Par ailleurs, une proposition de correction, pour ces deux lignes issues d'une erreur de raisonnement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    buffer = (char *) malloc(sizeof(char) * taille); 
    buffer = "ça marche !!!!!!";
    Ici le malloc est inutile car la chaine de caractère "ça marche !!!!!!" est créée à la compilation. De plus, tu ne libères pas ce buffer à la fin de ton programme, sans compter que tu ne t'en sers pas. Enfin, tu pourrais simplement faire un define avec cette chaine de caractère et gagner en concision dans ton code.

    Par ailleurs, je te conseillerais aussi de decouper ton main du client en plusieurs fonctions, car il rassemble des entitées qui n'ont rien à voir entre elles : lecture dans un fichier, initialisation de la connection, envoi de données.
    Et pour finir, si tu veux éviter de faire une boucle infinie dans le serveur, regarde du côté de select.

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/05/2015, 14h57
  2. [XL-2010] Mettre en colonne un fichier avec plusieurs lignes
    Par petitours dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 06/02/2015, 21h12
  3. Réponses: 0
    Dernier message: 16/06/2010, 18h06
  4. [NIO] envoie d'image à plusieurs client via socket
    Par robert_trudel dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 01/10/2006, 23h11

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