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 :

Communication par socket et SocketStream


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2007
    Messages : 180
    Points : 198
    Points
    198
    Par défaut Communication par socket et SocketStream
    Salut,

    j'ai un problème de gestion de mémoire en utilisant les sockets. L'application est assez simple. Un lecteur envoi des événements sur un port. L'appli reçoit, puis traite l'info.

    Initialisation :
    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
    private Socket m_socket_event;
    private NetworkStream socket_event;
    private StreamReader stream_event_reader;
    
    //.... plus tard dans le code
    
    if (this.m_socket_event != null)
    
    throw (new Exception("La socket du port événement est déjà connectée"));
    IPEndPoint port_event = new IPEndPoint(f_IPAddress, Int32.Parse("30008")); m_socket_event = new Socket(port_event.AddressFamily, SocketType.Stream, ProtocolType.Tcp); m_socket_event.Connect(port_event); if (m_socket_event.Connected == true) {
    socket_event = new NetworkStream(m_socket_event);
    stream_event_reader = new StreamReader(socket_event);
    }
    Jusque là, tout va bien. La réception des données se fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while(socket_event.DataAvailable)
    <div style="margin-left:40px">list_tag.Add(stream_event_reader.ReadLine();</div>
    Normalement, tant que j'ai des données sur la socket, la boucle se fait.
    Le problème est sur le normalement que je devrais changer en théoriquement.
    Exemple :
    sur 2 lectures indépendantes, je vais recevoir 30 messages de la première lecture. Puis 25 messages de la seconde qui se passe, disons 20 sec plus tard. Les messages des 2 lectures sont bien distinct.
    Lors de la seconde lecture, je reçois des messages de la première. C'est à dire que lors de ma première lecture, j'aurais du recevoir 35 messages, puis 20 à la seconde.
    Apparemment le socket_event.DataAvailable est à false, alors qu'il doit rester des données dans la socket.
    Je ne m'explique pas le problème.

    Si qqun a une idée de la provenance ou une alternative au code présentée... je suis preneur.

    Merci
    Une légende amérindienne raconte qu'il y eut un immense incendie de forêt. Tous les animaux terrifiés et atterrés observaient, impuissants, le désastre. Seul, un colibri s'activait et allait chercher quelques gouttes d'eau dans son bec pour éteindre le feu.
    Au bout d'un moment, le tatou, agacé par ses agissements dérisoires, lui dit :
    'Colibri ! N'es-tu pas fou ? Tu crois que c'est avec ces gouttes d'eau que tu vas éteindre le feu ?
    'Je le sais, répond le colibri, mais je fais ma part...

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2007
    Messages : 180
    Points : 198
    Points
    198
    Par défaut
    J'ai résolu mon problème de communication ou plutôt de gestion de la socket.

    Le problème venait du NetworkStream, propriété DataAvailable et du StreamReader, méthode readline().

    J'ai géré ça directement à partir de la socket et stockant les données dans un tableau Byte de la taille des données reçus, plus de problème.

    Je suppose que le NetworkStream, mérite bien son nom. S'il y a du flux réseau, pas de soucis, des données sont toujours "apparentes" ou disponibles. Si l'appli reçoit des données, mais que la gestion est trop longue. Une fois de retour sur la condition DataAvailable, il considére qu'il n'a plus de flux réseau, alors que des données sont toujours présentes et en attente d'être traité.
    Une légende amérindienne raconte qu'il y eut un immense incendie de forêt. Tous les animaux terrifiés et atterrés observaient, impuissants, le désastre. Seul, un colibri s'activait et allait chercher quelques gouttes d'eau dans son bec pour éteindre le feu.
    Au bout d'un moment, le tatou, agacé par ses agissements dérisoires, lui dit :
    'Colibri ! N'es-tu pas fou ? Tu crois que c'est avec ces gouttes d'eau que tu vas éteindre le feu ?
    'Je le sais, répond le colibri, mais je fais ma part...

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

Discussions similaires

  1. Communication par socket TCP entre module windows et linux
    Par =o0 MOH =0o= dans le forum Réseau
    Réponses: 2
    Dernier message: 29/03/2007, 17h04
  2. Communication par socket
    Par cybermarcel dans le forum Ruby
    Réponses: 5
    Dernier message: 14/01/2007, 23h08
  3. Problème de communication par socket
    Par odjosc dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 20/06/2006, 14h57
  4. [Omnis] Communication par Socket
    Par y0p dans le forum WinDev
    Réponses: 4
    Dernier message: 15/06/2006, 09h02
  5. Problème de communication par sockets
    Par Linio dans le forum Entrée/Sortie
    Réponses: 33
    Dernier message: 06/05/2006, 18h50

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