-
événement sur les socket
Bonjour,
Je dois faire une communication entre deux programmes. J'utilise les sockets pour réaliser cette communication.
Je voulais savoir si il existe un moyen de créer un événement lorsqu'une donnée est prête à être lue sur le socket. J'aimerais utiliser les événements pour ne pas mettre en attente tout le programme pour ça. J'ai fais une recherche sur internet, mais je n'ai rien trouvé de précis dans le Framework 2.0. Je pensais réaliser un Thread dédié uniquement au traitement de cette communication et utiliser la fonction "poll" pour savoir quand les données sont prêtes à être lues sur le socket.
Qu'en pensez-vous? Existe-t-il effectivement un moyen de créer un événement pour cela ?
Merci de votre aide.
J'utilise Visual Studio 2005 language VC++
Frédéric
-
Bonjour
Je n'ai pas la réponse sous la main, mais un truc m'interpelle : tu travailles en C++ managé, je suppose (sinon tu n'aurais pas posé la question sur le forum dotNet).
Quelle est la raison du choix "socket" pour ton IPC, ici ? en effet, il existe dans le framework (et dans le système) une panoplie de moyen de bien plus haut niveau, en général plus faciles de mise en oeuvre, au prix d'une moindre performance (mais la différence est souvent minime). Tu as des contraintes particulières qui imposent le choix de cette technique d'IPC ? (dont l'usage se fait de plus en plus rare, du moins pour des couches applicatives).
-
Bonjour,
Effectivement, je travail en C++ managé. J'ai un soft qui doit communiquer avec un automate programmable via le protocol TCP/IP. Cet automate m'envoie une commande (Trigger). Lorsque je reçois ce trigger, j'effectue une série de fonction dans mon soft et je lui renvoie une commande OK ou PAS OK.
Etant donné que je n'ai pas l'automate sous la main pour tester, le fournisseur m'a donné un petit programme de simulation de l'automate qui envoie ce trigger et qui recois la commande OK ou PAS OK. Ce programme envoie le trigger sur le protocol TCP/IP via un n° de port bien précis.
Donc moi, j'ai décidé (selon mes connaissances dans ce domaine) d'utiliser la class System::Net::Socket pour recevoir le trigger et renvoyer la commande OK et PAS OK.
Maintenant, cela fonctionne parfaitement si mon prgramme se met en attente de la réception du trigger. Mais je trouve que cette méthode n'est pas propre car elle bloc mon programme. Je voudrais plutot travailler sur un événement lancer lorsqu'une donnée vient d'etre reçue. C'est pour cela que je me posait la question si il existait une méthode pour faire cela.
Mais je viens d'utiliser un Thread qui effectue cette attente de réception et cela marche très bien.
Pour des utilisations futures, je vais probablement travailler sur des événements que sur des Threads.
-
Merci pour ta réponse. En effet dans ton cas l'usage des sockets s'impose.
Tu peux bien sur utiliser des threads auxiliaires, mais y ajouter l'usage des sockets en mode asynchrone (méthode BeginReceive, BeginSendTo).
Ainsi, tu invoque un BeginReceive et la méthode de callback sera appelée quand des données seront présentes.
Ceci n'est pas exclusif de l'usage du multithreading qui est même conseillé surtout si tu communiques avec plusieurs robots en même temps.
Pour cela, je te suggère de jeter un oeil à la classe ThreadPool.
-
Merci beaucoup pour cette réponse, je vais donc diriger mes recherches dans ce sens.