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 :

Recevoir des données (Sockets)


Sujet :

C#

  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 47
    Points
    47
    Par défaut Recevoir des données (Sockets)
    Salut,
    Je programme avec les sockets (asynchrones) actuellement pour un projet (on peut dire un petit FPS), et je dois envoyer des paquets en "boucle" à certains moments depuis le serveur, il fait très bien son travail mais je suis confronter à un problème au niveau du client: il reçoit plusieurs paquets dans le tableau de bytes (celui où est stocké la donnée (paquet ou message) reçue).

    Le serveur envoie par exemple en boucle le paquet suivant:
    moveright|500|1000
    Et le client reçoit:
    moveright|500|1000moveright|500|1000
    Donc ma question est: comment éviter ce problème étant donné que le serveur gère plusieurs clients en même temps (donc pas destiné à une seule socket)?

    Merci à vous.

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    C'est un problème de conception au niveau de tes "messages".
    ReadBytes te retourne tous messages TCP que tu reçus.

    L'une de solution pour éviter ce problème, et d'utiliser de vrai "message" avec un protocole.
    Par exemple en écrivant une structure comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct TCPMessage
    {
        uint RepereLogique
        uint Taille
        byte[] Donnes
    }
    Quand tu traitera le tableau retourné par ReadBytes, tu cherches ton RepereLogique (n'importe quel valeur fait l'affaire, du moment que tu utilise tout le temps la même), tu lis la Taille, et ensuite tu peut traiter la données.
    Pour savoir si quelqu'un d'autre communique avec toi, il suffit de contrôler que le RepereLogique est au bonne endroit (soit l'ancien + Taille + 2)

    Cette méthode a l'avantage d’être interopérable, donc de fonctionner avec d'autre langage

    Maintenant si tu n'as pas besoin de ça, il y a plus simple. N'utilise pas ReadBytes, et à la place du serialize/deserialize sur le NetworkStream.
    La serialization n’empêche pas d’établir un protocole avec de vrai "message".

  3. #3
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 47
    Points
    47
    Par défaut
    J'utilise effectivement la technique que tu m'a proposé à peu près:
    SESSION|TAILLE|ENTETE|VALEURS
    Et ensuite je découpe le paquet (tout ce que je ne veux pas est viré), ça fait que mon problème est réglé mais pas tout à fait étant donné que je reçois toujours des paquets en double.

    Je vais essayer de voir ta solution avec le RepereLogique mais j'avoue n'avoir pas très bien compris.

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 119
    Points
    25 119
    Par défaut
    ceci est normal dans l'utilisation des sockets, entre 2 lectures si 2 trames arrivent, elles sont concaténées dans le buffer
    buffer d'une taille limitée de 8ko et si tu as un message qui dépasse 8ko (ou plein qui sont arrivés et pas encore lus) le message sera coupé en 2
    genre moveright|5
    puis 00|1000
    et là ton code actuel planterais surement

    c'est à prendre en compte dans le codage, il faut soit un caractère de fin de trame, soit un message contenant la taille totale en entête (ou les 2)
    et ensuite rechercher une trame connue dans le tampon


    sinon tu peux voir wcf, qui s'occupe de toute cette partie socket pour n'exposer que des membres .net réseau
    et après tu peux faire une void moveright qui demande 2 int en paramètre et faire server.moveright(500,1000) depuis le client
    enfin si c'est toi qui code les 2 côtés du dialogue, car wcf n'est pas interopérable avec n'importe quoi

  5. #5
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 47
    Points
    47
    Par défaut
    Je n'y connais rien au WCF, aurais-tu de bons cours en français dessus qui me permettraient assez facilement de faire ce que je veux?

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 119
    Points
    25 119
    Par défaut
    pas spécialement, demande à google ou clic en haut de cette page sur tutoriels ...

  7. #7
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 47
    Points
    47
    Par défaut
    Très bonne idée.
    J'ai trouvé en cliquant en haut de cette page sur tutoriels mais rien d’intéressant en cliquant sur Google.
    Je vais mettre le sujet résolu pour le moment, merci à vous.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 119
    Points
    25 119
    Par défaut
    tu oserais nous faire croire que google ne répond rien d'intéressant à
    tutoriel c# wcf
    ??

  9. #9
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 47
    Points
    47
    Par défaut
    Hmm... oui, j'écrivais "C# WCF" et il y avait rien de bien, il manquait le "tutoriel" peut-être.
    Bon c'est pas un problème.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/04/2010, 13h04
  2. Réponses: 1
    Dernier message: 15/03/2010, 19h06
  3. Réponses: 7
    Dernier message: 07/01/2009, 08h53
  4. recevoir des données d'une autre fenetre
    Par Soncar dans le forum VB.NET
    Réponses: 2
    Dernier message: 03/06/2008, 12h47

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