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

Dotnet Discussion :

Sockets : exceptions levées par Begin* et End*


Sujet :

Dotnet

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Par défaut Sockets : exceptions levées par Begin* et End*
    j'ai quelques soucis avec l'utilisation des sockets :

    afin de transferer des données en p2p, j'utilise les methodes Socket.BeginReceive, Socket.BeginSend, Socket.EndReceive, et Socket.EndSend.

    Mon problème est simple : si l'un des programmes (serveur ou client) plante lors du transfert, ces methodes levent l'exception

    (System.Net.Sockets.SocketException)
    Une connexion existante a dû être fermée par l’hôte distant

    Comment prévenir ce problème sans utiliser des try{}catch{} répétitifs (navrant pour les performances)?


    précision : pourtant, je vérifie bien que le socket est connecté avant d'appeler une de ces methodes... exemple :
    C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (!socket.Connected)
    {
                    error(errorTypes.connexionLost);
         return;
    }
    socket.BeginReceive(buffer, 0, HEADER_SIZE, SocketFlags.None, new AsyncCallback(headerReceived), null);

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    si l'un des programmes (serveur ou client) plante lors du transfert
    Tu testes l'état de la socket avant le début du transfert ... pas pendant le transfert.

    Contrairement à ce que tu sembles penser, utiliser une structure try ... catch ne plombe pas les performances de ton code si tout se passe bien : ce qui peut plomber les performances, c'est lorsqu'une exception est levée et doit être gérée, comme le dit la MSDN :

    Une quantité importante de ressources système et de temps d'exécution est utilisée lorsque vous levez ou gérez une exception. Levez des exceptions uniquement pour gérer des conditions vraiment extraordinaires, et non pas pour gérer des événements ou un contrôle de flux prévisibles.
    Le plantage d'une socket lors d'un transfert n'est pas vraiment prévisible. Impossible donc d'éviter les try ... catch.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Par défaut
    merci
    cette réponse me va.

    je savais pas que c'est uniquement les levées d'exceptions qui détériorent les pefs..

    sorry

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

Discussions similaires

  1. Exception levée par l'initialiseur de type
    Par beretb dans le forum C#
    Réponses: 6
    Dernier message: 04/06/2009, 15h26
  2. Exception levée par l'initialiseur de type
    Par ted_2.3 dans le forum VB.NET
    Réponses: 5
    Dernier message: 02/05/2008, 23h14
  3. Réponses: 3
    Dernier message: 29/11/2007, 10h37
  4. Expliciter une exception levée par un objet OLE
    Par Bleuarff dans le forum Windows
    Réponses: 3
    Dernier message: 12/05/2005, 16h10

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