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 :

Socket Windows asynchrone


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 40
    Points : 63
    Points
    63
    Par défaut Socket Windows asynchrone
    Bonjour

    Je cherche un exemple de socket windows asynchrone (WsaAsyncSelect) mais je n'arrive pas a en trouver.

    J'ai déjà un programme tout simple qui fait server tcp,et un client qui s'y connect mais le tout de manière synchrone.
    Hors j'arrive dans un cas de figure, ou je ne sais jamais qui va communiquer en premier, je dois dont passer en asynchrone.

    Est-ce que quelqu'un aurait ça?

    Actuellement, je passe par les API windows (WSA) pensez-vous qu'il est préférable d'utiliser un wrapper / librairie déjà existante?
    Si oui laquelle?

    Merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 130
    Points : 33 063
    Points
    33 063
    Billets dans le blog
    4
    Par défaut
    Salut,

    ton message n'est pas très clair
    je ne sais jamais qui va communiquer en premier,
    Le serveur qui communiquerait en premier au client ? En TCP en plus alors que le client doit s'y connecter via connect ?
    Le serveur doit être lancé en premier, sinon aucune chance de pouvoir s'y connecter.

    je dois dont passer en asynchrone.
    Drôle de conclusion. Peut-être voulais-tu parler de non-bloquant plutôt ?
    Pour mettre un socket non bloquant sous windows il faut utiliser ioctl

    Pour l'utilisation de WSAAsyncSelect spécifiquement, la MSDN est plutôt complète https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 40
    Points : 63
    Points
    63
    Par défaut
    Bonjour

    Forcément, le serveur démarre, le client s'y connecte.

    Quand je dis que je ne sais pas qui va communiquer en premier, je veux dire par la que je ne sais pas qui va envoyer le message en premier.

    Le serveur peu dire "Voila un message"
    Le client répond "Reçu"

    Et inversement le client peu dire "Voila un message"
    Le serveur répond "Reçu"

    Je ne peux pas dire si c'est le serveur qui va démarre le dialogue de communication ou le client, d'ou ma nécéssité de passer en asynchrone ou non-bloquant en effet.

    J'avais vu pour la doc de WSAAsyncSelect sur msdn mais je me demandais si ce n'etait pas mieux un lib existante et si c'etait le bon moyen de faire sous windows

    Merci d'avance

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 130
    Points : 33 063
    Points
    33 063
    Billets dans le blog
    4
    Par défaut
    Je comprends mieux. C'est donc du non-bloquant.
    je t'aurais bien envoyé vers le cours que je suis en train d'écrire mais... il est en cours d'écriture, la partie serveur pas encore disponible en tant que cours. La partie cliente si, et si tu regardes les samples tu pourras avoir des idées de comment faire puisque du code serveur - un peu sal - y est disponible : http://www.developpez.net/forums/d15...mation-reseau/

    C'est toujours mieux une lib existante, puisqu'elle fait tout le boulot pour toi et possiblement mieux.
    Et oui c'est la bonne manière de faire sous Windows, puisque.. winsock est la lib socket de Windows. Cela dit, select est aussi disponible https://msdn.microsoft.com/en-gb/lib...(v=vs.85).aspx

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 40
    Points : 63
    Points
    63
    Par défaut
    Ha mince, dommage pour le cours :-p

    Merci pour la réponse.

    Je me doutais que je devais passer par la.

    Sinon dans les libs

    Boost ? Asio ? ce sont les 2 dont j'ai vu que on parlais.

    Par contre Boost ca inclus 20.000 trucs dont je n'ai pas besoin ... c'est un peu con.

    Une autre lib qui fonctionne bien?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 130
    Points : 33 063
    Points
    33 063
    Billets dans le blog
    4
    Par défaut
    Aucune idée, j'ai toujours travaillé avec les sockets en dur sur notre propre lib réseau.
    La seule chose dont tu as besoin c'est de définir un protocole d'échange, comme je le présente ici http://bousk.developpez.com/cours/re...ace-protocole/
    Ca et un chouilla de state machine et tu peux envoyer et recevoir ce que tu veux sans souci.
    TCP est très simple d'utilisation et pour pour implémenter ce genre de chose

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 199
    Points : 12 352
    Points
    12 352
    Par défaut
    ASIO, c'est la partie réseau de Boost.
    Boost est modulaire, on peut utiliser un bout s'en prendre le reste.
    Donc, on peut utiliser juste Boost.ASIO sans les trucs dont il n'a pas besoin.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    J'ai un vieil exemple de projet basé sur WSAAsyncSelect() (et maintenant que j'y pense, aussi un exemple plus récent... le premier était sous Visual 6...), mais il faut attendre que j'arrive chez moi ce soir pour remettre la main dessus.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Alors la bonne nouvelle, c'est que j'ai retrouvé mon code: Server03, le troisième projet de serveur de ma seconde année de BTS.
    (à noter que je n'ai pas découvert WSAAsyncSelect() tout seul ni dans les cours: C'est un redoublant qui me l'a mentionnée. Sans lui, mon projet de fin d'année -- le bien-nommé Server04 -- aurait probablement tourné beaucoup moins bien, avec un hideux multi-thread probablement pas thread-safe).

    La mauvaise nouvelle, c'est que c'est du code qui a treize ans, et ça se voit:
    • C'est un bordel de C et de "C++" qui ressemble plus à du C, avec des malloc() dont on caste le retour, etc. Et en plus, c'est indenté en Whitesmith.
    • Je ne savais pas utiliser les contrôles Windows à l'époque, donc le programme possède une console (depuis remplacée par une fenêtre "imitation console") et une fenêtre qui sert d'EditBox artisanale (on peut y taper des trucs comme l'adresse du serveur ou les messages à échanger). C'est cette fenêtre qui traite les messages de WSAAsyncSelect. J'ai dû agrandir sa hauteur dans le code, parce que les barres de titre ont doublé d'épaisseur entre Windows 9x et Windows 10 (et je ne connaissais pas AdjustWindowRect() à l'époque).

    Mais il contient quand même le principe de base: Accepter les connexions des clients, en maintenir une liste, et relayer les messages...

    La seconde bonne nouvelle, c'est que pour faire excuser le vieux code, j'y ait joint un code moins vieux lui aussi basé sur WSAAsyncSelect: Un projet de mes années d'école d'ingénieurs. Il est moins embrouillé, et avec ça tu devrais pouvoir comprendre, et un jour maîtriser, le fonctionnement d'un serveur bâti sur ce schéma.

    Un jour, je pourrais peut-être faire un code "d'exemple pur" de WSAAyncSelect sans fioritures, mais j'en doute fort, étant donné que de nos jours je programme plutôt en C# (y compris un serveur de mini-chat bien plus moderne).
    Fichiers attachés Fichiers attachés

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 40
    Points : 63
    Points
    63
    Par défaut
    Merci pour les infos et les sources , je regarderai cela demain matin :-)

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

Discussions similaires

  1. [Reseau] probleme de socket windows
    Par le novice2 dans le forum Réseau
    Réponses: 4
    Dernier message: 24/07/2007, 20h13
  2. [C++][Socket] Evenement asynchrone
    Par rosewood00 dans le forum C++
    Réponses: 2
    Dernier message: 10/12/2006, 16h05
  3. Socket windows/Linux
    Par yodaime dans le forum C++
    Réponses: 7
    Dernier message: 11/04/2006, 17h33
  4. [SOCKET] Windows et linux
    Par Gmrinfo dans le forum C++
    Réponses: 3
    Dernier message: 21/02/2006, 23h44
  5. [socket & windows & accept]
    Par Magique dans le forum Réseau
    Réponses: 7
    Dernier message: 01/05/2004, 00h34

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