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

VB.NET Discussion :

[VB.NET] Pourquoi mon transfert de fichier asynchrone échoue ?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut [VB.NET] Pourquoi mon transfert de fichier asynchrone échoue ?
    Bonjour,

    j'ai un gros soucis : je tente de transferer un fichier par les sockets en asynchrome mais alors il envoi tellement vite les données dans la boucle que l'autre partie n'a meme pas le temps de recevoir !!! Et apres 10s ca fait une erreur disant que la file d'attente est saturée !

    Pourtant le asynchrome devrait gerer ca, je comprends pas car des qu'il envois des données, la socket devrait attendre que l'autre partie recoivent bien ces données avant de continuer... non ?

    Pourquoi ca fait ca ?

    Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    et non justement, c'est ca la caractèristique d'une ligne asynchrone. Comme son nom l'indique elle est asynchrone, SOUS TOUS LES SENS du terme. Ca signifie qu'elle est asynchrone au sens du temps, elle intervient n'importe quand, mais elle est également asynchrone au niveau du réseau. En dehors des spécificités de TCP/IP, lorsque tu envoie en asynchrone des données, rien ne garantie qu'elles sont bien recue avant d'en envoyer d'autres, car tu n'attend plus les acknoledges et tot ou tard, si tu fait pas attention, tu sature les buffers.
    Le seul moyen, intégrer dans ton protocole personnel un mécanisme d'acquiessement pour compenser. Ainsi tu n'envoie que N paquet sachant que tu n'explosera pas le buffer cible, et tu attend gentillement que l'autre renvoie un acquiessement, et zou tu recommence en masse. Certes tu perd un peu la notion d'asynchrone, mais ca dépend quelle notion te plait, asynchrone au niveau du temps ou au niveau du transfert !

    il ya un moyen de contrer ce probleme, mais là la solution ne conviendra pas dans tous les cas. Il suffit d'associer la socket a un thread propre qui synchronise et centralise les accès à la socket des autres threads, en gros, tu émule toi meme l'asynchrone sur du synchrone ! L'avantage tu garde tous les avantage du mode synchrone, et cela permet de programmer assez facilement des modeles handshake (poignées de main) et du coté de ton appli, tu a une impression d'asynchrone ...
    J'avais un probleme similaire, je l'ai réglé de cette facon, encore une fois, cette solution convenait à mon probleme, mais ne conviendra probablement pas à d'autres problemes. C'est à toi de voir

  3. #3
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Je suis en train de programmer un serveur en asynchrone et justement je me posais cette question.
    Donc si je résume pour éviter que le buffer du poste réceptionneur il faut alors découper l'envoie par pacquet de la taille de buffer soit si je me rappelle 7ko.Et tu proposes de le découper par un thread propre a la socket d'envoie qui effectue la temporisation nécessaire pour que le poste réceptionneur est le temps de lire.
    Soit calculer le nombre de trame envoyée et de le stopper en faisant un sleep ou attente d'une réponse client si elle arrive a saturation du buffer client.

    Est ce que j'ai bien compris ?

    Merci

Discussions similaires

  1. Transfert de fichiers volumineux par le net
    Par K-Kaï dans le forum Général Conception Web
    Réponses: 8
    Dernier message: 14/07/2008, 13h15
  2. Réponses: 10
    Dernier message: 30/06/2006, 18h48
  3. Réponses: 6
    Dernier message: 13/04/2006, 15h54
  4. [VB.Net] Transfert de fichier local vers serveur
    Par geros dans le forum ASP.NET
    Réponses: 4
    Dernier message: 13/02/2006, 15h14
  5. Réponses: 11
    Dernier message: 13/01/2006, 21h54

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