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

Windows Forms Discussion :

[C#] acquittement de messages envoyé entre 2 pc


Sujet :

Windows Forms

  1. #1
    Membre extrêmement actif Avatar de cortex024
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 301
    Points : 1 119
    Points
    1 119
    Par défaut [C#] acquittement de messages envoyé entre 2 pc
    Bonjour,

    je fais un jeu de combat naval en réseau.
    Une fois que les joueurs ont placés leur bateaux, avant de lancer le jeu, chaque application envoie sa grille à l'autre.
    Je procède comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (k=0;k<101;k++)
    {
    	l=grid[k];
    	this.MyClient.Send(Encoding.Unicode.GetBytes(l.ToString()));
    	System.Threading.Thread.Sleep(400);
    }
    et je réceptionne de l'autre côté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (this.num_transfert<101)
    {
    	grid2[num_transfert]=Int32.Parse(this.recu.Text);
    	num_transfert=num_transfert+1;
    }
    Donc 2 boucle qui envoient ou recoivent la grille.

    J'utilise un sleep de 400 par mesure de sécurité pour ne pas aller trop vite et pour etre sur que l'application réceptrice ne plante pas en recevant plusieurs éléments à la fois,....
    Tout marche très bien mais ce n'est pas très sur, et cela est très lent du à la sécurité (sleep de 400).


    J'aimerais donc pouvoir faire un acquittement, l'application emetrice attendant le signal pour envoyer l'élément suivant.

    Comment pourrais je faire?

    je pense à ceci:
    Une variable globale qui passe à 1 quand on a recu le signal, et qui repasse à 0 dès qu'on a envoyé un élément? signal envoyé donc par le récepteur apres chaque élément?


    Merci de vos conseil et réponses.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Tu ne donnes aucune info sur la communication.
    Je suppose qu'elle est réalisée par des Sokets en TCP.
    Dans ce cas la communication est bidirectionnelle. Aucun problème pour établir un dialogue.

    Placer Send(données) puis Receive(accuséRéception) dans la boucle d'émission et
    Receive(données) puis Send(accuséRéception) dans la boucle de réception.

    Utilise les exceptions pour détecter les timeouts et la rupture de connection.
    On ne peut pas faire boire un âne qui n'a pas soif.

  3. #3
    Membre extrêmement actif Avatar de cortex024
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 301
    Points : 1 119
    Points
    1 119
    Par défaut
    comment utiliser les receive??

    Je précise que je débute en programmation "réseau".

    Oui c'est tcp avec sockets.

    Le problème est que lorsque je boucle en attendant l'accusé de réception, le programme boucle dans le vide en attendant l'accusé et plante.

    Coté récepteur, pas de problème pour envoyer l'accusé, c'est coté emmeteur vu qu'il est "coincé dans la boucle"

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Socket.Receive() est une fonction synchrone qui ne retourne qu'après avoir reçu un message.
    Une exception est levée si le message tarde trop (timeout).
    On ne peut pas faire boire un âne qui n'a pas soif.

  5. #5
    Membre extrêmement actif Avatar de cortex024
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 301
    Points : 1 119
    Points
    1 119
    Par défaut
    ok, merci pour tes réponses.

    Pour le moment j'ai un peu modifié mon code, je ne reste plus bloqué dans une boucle, je passe simplement dans une fonction pour envoyer l'élément suivant lorsque je recois l'acquittement.

    Je verrai pour la suite pour amélioré la fiabilité en utilisant le timeout en cas de problème sur la ligne.

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

Discussions similaires

  1. [VB6] intercepter un message envoyé avec PostMessage
    Par jul54 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 03/07/2006, 11h34
  2. Réponses: 5
    Dernier message: 29/08/2005, 14h51
  3. [DEV] PL/SQL Message envoyé pendant l' execution
    Par ducho dans le forum PL/SQL
    Réponses: 1
    Dernier message: 13/07/2005, 08h04
  4. Réponses: 13
    Dernier message: 14/01/2004, 16h35

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