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

C# Discussion :

ENOBUFS avec FTPWebRequest


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Par défaut ENOBUFS avec FTPWebRequest
    Bonjour,

    Je ne sais pas trop si mon message se trouve dans la bonne rubrique car mon problème est vraisemblablement également lié à l'OS sur lequel tourne mon code. Donc désolé par avance si mon post est hors sujet...

    Voilà: j'ai conçu un petit client FTP en C# chargé de récupérer/transmettre de petits fichiers (<10Ko) à période constante (toutes les 5 secondes) depuis un poste Windows.
    Ce client utilise des FTPWebRequest pour réaliser ces échanges de fichiers. A chaque accès (toutes les 5 secondes donc) je recréé un FTPWebRequest pour télécharger et ou uploader ces fichiers.

    Il arrive de temps en temps que ce client soit dans l'incapacité de de contacter le serveur faute de mémoire: "ENOBUFS - Out of memory". Une fois le PC dans cet état le seul moyen de récupérer une connexion valable est de le redémarrer... Dans cet état même Filezilla client est incapable de monter la moindre connexion avant un reboot.

    je souhaiterais trouver un moyen pour soit éviter cette erreur (réduire la période de consultation?) soit la contourner (libérer de la mémoire ?) et tout celà en C# si c'est possible.

    Auriez-vous une piste à me proposer ou un conseil à me donner ?

    Merci.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Difficile à dire sans voir ton code, mais a priori je dirais que tu ne libères pas correctement les objets utilisés pour le transfert. Pense à toujours appeler Dispose sur les objets qui implémentent IDisposable

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Par défaut
    Merci pour cette réponse,

    A priori les seules classes implémentant IDisposable que j'utilise sont des FileStream et des StreamReader sur lesquels j'utilise un using.

    Exemple avec la méthode la plus souvent utilisée (liste des fichiers distants):

    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
                    FtpWebRequest oRequest = null;
                FtpWebResponse oResponse = null;
                    oRequest = BuildRequest(strDataLocation, WebRequestMethods.Ftp.ListDirectory);
     
                    oResponse = (FtpWebResponse)oRequest.GetResponse();
                    Stream oResponseStream = oResponse.GetResponseStream();
     
                    using (StreamReader oReader = new StreamReader(oResponseStream))
                    {
     
                        while (!oReader.EndOfStream)
                        {
                            string strFileName = "";
                            strFileName = oReader.ReadLine();
                            listDistantFiles.Add(new cFileStatus(System.IO.Path.Combine(strDataLocation, strFileName), (int)cFileStatus.eStatus.NOT_TRANSFERED, ""));
                        }
     
                        cTraceLogger.GetInstance().TraceInfo(ID, String.Format("Distant file listed successfully [Count={0}]:{1}", listDistantFiles.Count, oResponse.StatusDescription));
                        oResponse.Close();
                        oReader.Close();
                    }
    La méthode BuildRequest construit un nouveau FTPWebRequest avec les paramètres suivant:

    oRequest.KeepAlive = false;
    oRequest.UsePassive = false;
    oRequest.Timeout = 5000;
    oRequest.UseBinary = false;
    Dernier détail: je suis en .NET 3.5

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par the_pecheur Voir le message
    A priori les seules classes implémentant IDisposable que j'utilise sont des FileStream et des StreamReader sur lesquels j'utilise un using.
    Non, il y a FtpWebResponse aussi... Si tu ne le Dispose pas, ça pourrait être la cause de ton problème. Essaie de le mettre dans un using, il y a de bonnes chances que ça règle le problème

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Par défaut
    Je vais tenter çà merci !
    Je posterais une réponse en cas de succès dans les prochaines semaines (je ne sais pas reproduire les conditions du bug).

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Par défaut
    Encore une question sur le sujet: lorsque le PC est dans cet état (ENOBUFS - Out of memory), le gestionnaire de ressources ne fait pas apparaitre de surcharge de la mémoire vive, j'ai donc du mal à identifier de quelques ressources il s'agit... Si quelqu'un à des infos je suis preneur.

    Sinon le test est en cours...

Discussions similaires

  1. Connexion FTPS avec FtpWebRequest
    Par jsd03 dans le forum C#
    Réponses: 0
    Dernier message: 29/01/2013, 16h49
  2. VB et Upload avec FtpWebRequest
    Par angeld dans le forum VB.NET
    Réponses: 5
    Dernier message: 30/11/2010, 11h51
  3. Problemes avec FtpWebRequest
    Par acheo dans le forum Services Web
    Réponses: 16
    Dernier message: 06/08/2009, 13h28
  4. [3.5] problème de FTPS avec FtpWebRequest
    Par David.V dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 23/04/2009, 10h32
  5. Bug avec FtpWebRequest
    Par smyley dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 19/08/2008, 01h51

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