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

MFC Discussion :

[WinSock] Question sur les sockets (accept)


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 30
    Points
    30
    Par défaut [WinSock] Question sur les sockets (accept)
    alors j'ai fait un projet en socket d'abord en MFC avec CSocket, CArchive etc...

    Le client/serveur marche, mais je le trouve pas très stable, surement lié au fait que je ne connais pas trop le réseau


    Mais qu'à cela ne tienne, je me mis au WinSock du coup pour essayer une alternative

    Alors tout marche bien. Côté serveur j'ai :
    - initialisation de WinSock
    - création d'une socket avec les infos nécessaires
    - bind sur l'adresse et le port
    - listen
    - accept
    - affichage de l'ip du client
    - close socket
    - CleanUp de WinSock


    en gros pour simplifier, le serveur n'attend qu'une seule et unique connexion et affiche l'ip qui a tentée de se loguer puis se coupe



    la version client marche aussi :
    - init, création de socket
    - connect sur l'ip et le port du serveur
    - close, cleanup



    et ça marche (c'est beau l'informatique)



    Mais voila, au dela de la connexion qui fonctionne, j'ai un probleme lié à la fonction "accept".
    Elle attend qu'une connexion arrive, et tant que ce n'est pas le cas, elle bloque le processus du serveur en cours, ce qui a notamment pour effet de stopper l'affichage. Ce qui est plutôt gênant, vu que j'utilise une fenêtre de diagnostique pour afficher des états (calculs en cours, nombre de connexion, etc)


    Existe t il une alternative pour "tester" si quelqu'un tente de se connecter plutôt que d'attendre dans le vide obligatoirement jusqu'à ce que quelqu'un viennent, histoire de n'enclencher le accept que lorsqu'il est utile pour pouvoir faire autre chose en même temps que cette attente ?

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    et bien tu places l'attente de connexion dans un thread ...
    et si ton application est graphique lorsque la connexion est effective tu envois un message privé a la fenetre de traitement.
    voir faq:
    http://c.developpez.com/faq/vc/?page...d#WorkerThread
    http://c.developpez.com/faq/vc/?page...PrivateMessage

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ou bien, dans une application MFC Graphique, tu utilises CAsyncSocket au lieu de CSocket.

    Cela te permettra de réagir de manière événementielle à ce qui se passe sur le réseau, plutôt que de faire l'attente toi-même.

    Pour plus d'informations sur les sockets asynchrones, regarder la doc de la fonction de l'API WSAAsyncSelect().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    merci à tous les deux

    j'utilise maintenant les Winsock en multithread (un thread pour l'écoute, puis un nouveau pour chaque client), et jusque là, ça marche bien, sans gêner l'affichage


    Pour les MFC, j'ai eu des problemes non pas liés à l'affichage, mais au maintient assez aléatoire de la connexion, et c'est pour ça que je fais en winsock pour voir.

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

Discussions similaires

  1. Questions sur les sockets (fonctions synchrones)
    Par azerty25 dans le forum Général Dotnet
    Réponses: 7
    Dernier message: 29/06/2007, 00h57
  2. [debutant][Client-serveur] Question sur les sockets
    Par skwi6 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 06/11/2006, 15h04
  3. Question sur les socket AF_UNIX
    Par Mr_Chut dans le forum Réseau
    Réponses: 3
    Dernier message: 10/06/2006, 11h42
  4. Questions sur les socket
    Par lapras123 dans le forum Réseau
    Réponses: 13
    Dernier message: 09/06/2006, 16h34
  5. Encore une petite question sur les sockets...
    Par damien99 dans le forum MFC
    Réponses: 4
    Dernier message: 15/02/2006, 14h22

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