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 :

Socket et envoie de fichier texte


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 6
    Points
    6
    Par défaut Socket et envoie de fichier texte
    Bonjour,
    Je veux créer une petite application client-serveur pour le transfert des fichiers, genre un mini FTP pour les fichiers texte.
    Mon problème est de réaliser l'envoi récursif: Le serveur reste toujours à l'écoute, et le client peut envoyer plusieurs fichiers; l'un après l'autre. Pour la partie client, je n'ai pas vraiment de problèmes, mais pour la partie serveur, quand je met une boucle infinie pour l'écoute, l'envoi n'aboutit pas. Je ne sais pas où est l'erreur.. PS: Je suis sous Fedora 18. Voici la partie 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
    #include<stdio.h>
    #include<sys/socket.h>
    #include<sys/types.h>
    #include<netinet/in.h>
    #include<netdb.h>
    #include<string.h>
     
    #define max 3000
     
    main(){
     
           int s,a,b,c,r,longueur;
           struct sockaddr_in serveur,client;
           struct hostent *adr_h;
     
        //Remplissage de la structure serveur
        serveur.sin_family=AF_INET;
        serveur.sin_addr.s_addr=INADDR_ANY;
        serveur.sin_port=htons(2502);
     
     
        if((s=socket(AF_INET,SOCK_STREAM,0))==-1) perror("\nSocket : ");
         else printf("\nSocket crée");
     
        //Affecter un nom à la socket
        if((b=bind(s,(struct sockaddr*)&serveur,sizeof(serveur)))==-1) perror("\nBind : ");
         else    printf("\nBind réussi");
     
        //Construction de l'adresse
        adr_h=gethostbyname("127.0.0.1");
        bcopy((char *)adr_h->h_addr,(char *)&serveur.sin_addr,adr_h->h_length);
     
        //Fonction listen : 5 connexion maximum
        listen(s,5);
        printf("\n\nLe serveur attend une connexion\n");
        //Accept: Le serveur est prêt et attend des connexions
        longueur=sizeof(client);
        if((c=accept(s,(struct sockaddr *)&client,&longueur))<0) perror("\nConnexion échouée : ");
        else { 
    		printf("Connexion réussie avec le client\n\n");  //Communication avec le client 						
    		char nom[100]="";
    		printf("Entrez le chemin où vous voulez enregistrer le fichier: ");
    		scanf("%s",nom);
    		FILE* f= fopen(nom,"w+");	 	// Créer le fichier local avec le nom indiqué en mode écriture
    		char v[0];  				// Variable pour la réception
     
    		do
    		{
    		recv(c,v,1,0);				// Recevoir d'un seul caractère
    		if(v[0] == EOF ) break;		 	// Si ce caractère est un End Of File (EOF), sortir de la boucle		
    		fputs(v,f);			 	// Ecrire le caractère dans le fichier
    		}while(1);
    		close(f); 			 	// Fermer du fichier
    		printf("Fichier bien reçu\n\n");	
    	 }	
        							//Fermer les sockets
        close(c);   
        close(s);
    }
    Et la 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
    #include<stdio.h>
    #include<stdlib.h>
    #include<sys/socket.h>
    #include<sys/types.h>
    #include<netinet/in.h>
    #include<netdb.h>
    #include<string.h> 
    #define max 3000
     
    main()
    {     
         int s,a,t;
         struct hostent *adr_h;
         struct sockaddr_in serveur;
     
         char nom[100]=""; 
         printf("\nEntrez le chemin du fichier que vous voulez envoyer: ");
         scanf("%s",nom);
     
         //***************** Remplissage de la structure serveur
         serveur.sin_family=AF_INET;
         serveur.sin_port=htons(2502);
     
         //***************** Creation de la socket
         if((s=socket(AF_INET,SOCK_STREAM,0))<0) perror("\nSocket : \n");
       else printf("\nSocket créé\n");
     
         //***************** Construction de l'adresse
         if((adr_h=gethostbyname("127.0.0.1"))==0) perror("\nMachine inconnue");
          else bcopy((char *)adr_h->h_addr,(char *)&serveur.sin_addr,adr_h->h_length);
     
         //***************** Connexion au serveur
         if(connect(s,(struct sockaddr *)&serveur,sizeof(serveur))<0) perror("\nEchec de la connexion avec le serveur");
         else 
    	{ 
    	FILE* f= fopen(nom,"r+"); 			// Ouvrir le fichier local en mode lecture	
    	char v; 					// Variable d'envoi
     
    	do
    	{	
    	v=fgetc(f); 					// Lire le caractère
    	t=send(s,(const char*)&v,sizeof(v),0);		// Envoyer le caractère
    	}while(v!=EOF); 				// Reboucler si on n'atteint toujours pas la fin du fichier
    	close(f);					// Fermer le fichier
    	printf("Fichier envoyé\n\n");
    	}
           close(s);					// Fermer la Socket
    }
    Merci d'avance.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Tout d'abord, veuillez indenter votre code correctement.
    De plus, même si un if, ne possède qu'une seule ligne, veuillez utiliser les accolades afin de contenir cette ligne, cela rendra le code plus lisible.
    Pour envoyer un fichier, la meilleure méthode est d'envoyer la taille (sur 4 ou 8 octets) puis d'envoyer le fichier. Le serveur, lira la taille, sera quelle est le nombre de données à lire par rapport à ce message et fera donc un recv approprié pour lire le fichier.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 6
    Points
    6
    Par défaut
    J'ai évidemment déjà pensé à ça, mais comment faire?

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    En envoyant la taille du fichier en premier (pour connaitre la taille du fichier, on peut faire un fseek pour se mettre à la fin puis ftell()), avec send (coté client) puis de la recevoir avec recv. Ensuite, on envoit le fichier comme vous faites ,dans une boucle, par exemple.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 6
    Points
    6
    Par défaut
    Mon problème n'est pas vraiment l'envoi.. mais juste quand je met une boucle infinie au niveau du serveur, ça ne marche pas! Ce petit code fonctionne fichier par fichier, c'est à dire que je dois à chaque fois démarrer le serveur et le client pour envoyer un fichier!

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Le fait d'envoyer la taille, permet de changer la boucle, pour une boucle limité à la réception de la taille. Ainsi, vous pourrez envoyer les fichiers les uns après les autres et vous aurez la possibilité de déterminer quand le fichier est fini.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

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

Discussions similaires

  1. Partage d'imprimante et envoi de fichier texte
    Par triaguae dans le forum Windows 7
    Réponses: 5
    Dernier message: 23/02/2015, 14h52
  2. Envoi de fichier text en post
    Par sandokan66 dans le forum Langage
    Réponses: 3
    Dernier message: 26/01/2007, 08h57
  3. [socket] probleme d'envoi de fichier
    Par soulhouf dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 21/10/2005, 16h15
  4. [Débutant] Envoi de fichier par socket
    Par zapho dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 26/05/2004, 18h58
  5. [Socket]envoie de fichier!!!
    Par SamDaKap dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/11/2002, 08h07

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