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#] [Sockets] Eclaircissements pour connexions asynchrones


Sujet :

Windows Forms

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut [C#] [Sockets] Eclaircissements pour connexions asynchrones
    Bonjour,
    je désire créer deux appliactions toutes betes (pour apprendre a me servir des sockets). Une serveur et une cliente.

    le but est que le client se connecte au serveur et une fois connecter, on peut lui envoyer une chaine, le serveur la recoit et la renvoit au client. Rien de bien méchant.

    J'y arrive parfaitement en mode synchrone.
    En revanche, en ce qui concerne le mode asynchrone, j'éprouve qques difficultés de compréhension.

    Je parle uniquement de la connexion du client au serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	private static ManualResetEvent connectDone = new ManualResetEvent(false);
     
    private void cmdaConnexion_Click(object sender, System.EventArgs e)
    {
    	System.Net.IPAddress AdresseIP = System.Net.IPAddress.Parse("192.168.0.1"); 
    	System.Net.IPEndPoint Serveur = new IPEndPoint (AdresseIP,8221); 
    	socWorker=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    	socWorker.BeginConnect(Serveur, new AsyncCallback(ConnectCallback), socWorker);
    connectDone.WaitOne();
    }
    avec la procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private static void ConnectCallback(IAsyncResult ar)
    {
    	Socket socWorker = (Socket) ar.AsyncState;
    	client.EndConnect(ar);
    	connectDone.Set();
    }
    lors du socWorker.BeginConnect, je n'arrive pas a comprendre le sens de l'arguement new AsyncCallback(ConnectCallback), a quoi sert il ?...

    je ne comprend pas bien car comme argument, il appelle la procédure ConnectCallback qui elle meme prend comme argument ar alors que je ne l'ai spécifié nulpart...

    Bref, si qqun pouvait m'expliquer simplement le principe de fonctionnement de la connexion asynchrone je vous en serais tres reconnaissant car j'ai un peu de mal j'avoue.

    Et si aussi vous avez des tutos je suis preneur

    merci d'avance

  2. #2
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Salut
    Rien de bien compliqué
    Citation Envoyé par Sinclair
    lors du socWorker.BeginConnect, je n'arrive pas a comprendre le sens de l'arguement new AsyncCallback(ConnectCallback), a quoi sert il ?...
    Chaque appel socket Asynchrone (BeginXXX) prend comme argument (entre autre) un delegué. Un délégué est un objet qui représente l'adresse d'une fonction. Il a un prototype définit à l'avance.
    Dans ton exemple, l'appel à BeginConnect reçoit l'adresse de la fonction ConnectCallback comme argument.
    L'appel retourne immédiatement sans attendre la connexion
    Lorsque la connexion reussi (ou échoue) ConnectCallback est appelée par le Systeme.
    Pour plus d'infos BeginConnect

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    merci de ta réponse.

    et l'argument IAsyncResult ar de la fonction ConnectCallback je ne l'ai jamais renseigné. a quoi correspond-il ?

  4. #4
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    C'est l'état de la connexion asynchrone.
    Tu peux renseigner un seul de ses membres, AsyncState.
    Tu le renseignes dans ton exemple en passant la socket socWorker qui a initié la connexion en troisième argument de beginConnect.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    private static void ConnectCallback(IAsyncResult ar)
    {
     
       Socket socWorker = (Socket) ar.AsyncState; // recuperation du troisième argument de BeginConnect
       socWorker .EndConnect(ar); // Finir l'opération asynchrone
       connectDone.Set();
    }

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    merci de toutes ces lumieres

  6. #6
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    j'ai tout de meme une petite question :

    j'ai mes deux applis (client et serveur)

    si je veux que le client (on admet qu'il est déja connecté) envoi quelque chose au serveur (disons un byte[]) et que quand ce serveur lit le byte[], il le renvoi au client (en fait c'est ce que j'explique dans le premier post)

    je veux effectuer ca en mode synchrone, il m'importe peu que le programme soit bloqué pendant que la requete est en cours.


    J'y arrive mais pour le client, si je veux recevoir les données, il faut que je créé un évenement pour pour lire ce qui vient du serveur. Si le serveur n'a rien envoyé, l'appli sera bloquée jusqu'a ce que le serveur renvoi quelque chose.


    Or je voulais savoir s'il est possible en mode synchrone que le client aille chercher directement le byte[] lorsqu'il en recoit un sans que l'utilisateur ne génère l'évenement qui va verrifié. En temps réel quoi. Ou alors il faut forcément etre en mode asynchrone.

    merci

  7. #7
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Je ne te suis pas très bien.
    Pour le client, pour recevoir des données en mode synchrones, tu n'as pas besoin de "créer un évenement". Il te suffit d'appeller la fonction Receive sur la socket client.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/10/2012, 01h18
  2. Réponses: 4
    Dernier message: 09/04/2010, 10h42
  3. [Hibernate] utilisation de JNDI pour connexion MySql
    Par michaelbob dans le forum Hibernate
    Réponses: 1
    Dernier message: 14/03/2006, 16h08
  4. [SOAP] API pour appels asynchrones
    Par Dar Shak dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 26/04/2005, 08h57
  5. [Socket] erreur de connexion
    Par coachbob44 dans le forum C++
    Réponses: 4
    Dernier message: 03/03/2005, 17h14

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