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 :

[TCP] Pb transfert de fichier


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Par défaut [TCP] Pb transfert de fichier
    Bonjour,

    Je suis en train d developper une petite application permettant a un client de se connecter a un serveur puis de recuperer des fichiers. J'utilise le protocole TCP. Un probleme intervient lorsque j'essaie de transferer des fichiers de plusieur ko.
    Ler serveur effectue bien l'envoi de tous les octets du fichiers (la somme des retours du send() est égale a la taille du fichier) mais le client reste bloqué sur un recv() car a un moment dans la boucle while, la valeur de retour de recv n'est pas la taille du tampon (256, 128 ou autres) mais une valeur tres faible, generalement 6.
    Note : en faisant afficher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     cout << S0_SNDBUF << "\t" << SO_RCVBUF << endl;
    je m'apercoit que le premier vaut 7 et le second 8, mon probleme viendrait - il de là ?

    Merci d'avance.

  2. #2
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Par défaut
    Voila un bout de code montrant comment se fait l'envoi coté serveur et la reception coté 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
     
    //********Coté serveur**************
    				long tailleFichier = getSize(nom);  //renvoie la taille du fichier nom
    				char msg[256];
    				sprintf(msg, "%d", tailleFichier);
    				int lgMsg = strlen(msg);
    				int snd = send(descBr, msg, lgMsg, 0); //on envoie la taille du fichier au client
     
    				//Si le fichier existe on l'expédie au client
    				if (tailleFichier != -1)
    				{
    					//Ouverture du fichier a envoyer
    					size_t s = nom.size() + 1;
    					char * nomFichier = new char[ s ];
    					strncpy( nomFichier, nom.c_str(), s );
    					FILE* fichier;
    					if((fichier=fopen(nomFichier, "rb")) == NULL)
    					{
    						cout << "Probleme lors de l'ouverture du fichier." << endl;
    					}
     
    					//Expedition du fichier
    					cout << "Debut de l'expedition du fichier" << endl;
    					int octetsEnvoyes = 0;
    					int octetsLus;
    					char buffer [256];
    					while(octetsEnvoyes != tailleFichier)
    					{
    						octetsLus=fread(buffer, 1, 256, fichier);
    						snd = send(descBr, buffer, octetsLus, 0);
    						octetsEnvoyes = octetsEnvoyes + snd;
    				         }
     
    					//On fini par fermer le fichier
    					fclose(fichier);
    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
     
    //*************Coté client****************
            char  tamponReception [256];
    	int lgReception = sizeof(tamponReception);
    	int retourRecv = recv (descLocale, tamponReception, lgReception, 0); //recption de la taille du fichier
    	tamponReception[lgReception] = '\0';
    	long tailleFichier= atoi (tamponReception);
     
    	//On crée et ouvre le fichier que va nous envoyer le serveur
    	FILE* fichier;
    	if((fichier=fopen("./monFic", "wb")) == NULL)
    	{
    		cout << "impossible de creer le fichier" << endl;
    	}
    	long octetsRecus = 0;
    	while(octetsRecus != tailleFichier)
    	{
    			retourRecv=recv(descLocale,tamponReception, 256, 0);
    			octetsRecus = octetsRecus + retourRecv;
    			fwrite(tamponReception, 1, retourRecv, fichier);
    	}
    	fclose(fichier);

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    SO_SNDBUF n'est pas la taille du buffer, c'est seulement le numéro d'option qui permet d'obtenir sa taille avec getsockopt().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Par défaut
    c'est exact : d'ailleur je viens de faire un setsockopt avec des valeurs identiques pour SO_SNDBUF et SO_RCVBUF et mon probleme reste inchangé. Dès que je transfere des fichiers de quelques ko un des buffers n'est rempli qu'a 5 ou 6 char coté client en plein milieur de la transmission alors qu'il devrait etre de 256. J'ai testé avec des valeur beaucoup plus faible de l'ordre de 16 ou 32 et ça plante toujours dès que le fichier est trop gros :/
    Quelques remarques bizarre :
    - si je met la taille de mon buffer à une valeur <= 7 là c'est ok meme pour des fichiers plus gros (comme un mp3 de qques MO) mais c'est horriblement long;
    - lorsque je teste sur des petits fichiers (sources de mon prog par exemple, ça marche tout le temps.
    - Pour un meme fichier faisant planter, le buffer de taille anormalement rempli est toujours de la meme taille (5 ou 6)

  5. #5
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Par défaut
    une idée?

  6. #6
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Par défaut
    Je suis toujours sur le même probleme mais je viens de constater que si le serveur et le client sont sur deux machines distinctes cela fonctionne mais cela echoue pour des fichiers dont la taille est superieure a quelques ko si serveur et client cohabitent sur la meme machine :/

Discussions similaires

  1. Problème de Transfert de fichiers en TCP
    Par BibiDev11 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 22/11/2013, 11h44
  2. TCP et transfert de fichiers : Perte de données ?
    Par Latoof dans le forum Réseau
    Réponses: 2
    Dernier message: 31/10/2011, 14h30
  3. transfert de fichier via TCP
    Par marion5515 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 29/02/2008, 11h06
  4. [TCP]Transfert 1 fichier,OK - Plusieurs fichiers, PROBLEME
    Par sqwam71 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 15/06/2006, 15h32
  5. Réponses: 16
    Dernier message: 28/11/2005, 19h09

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