begin process at 2012 02 13 13:55:02
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

Réseau & Internet

 > 

Utilisation socket Synchrone et Asynchrone simultanément


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Utilisation socket Synchrone et Asynchrone simultanément

mardi 6 janvier 2009 à 09:38:58 | Utilisation socket Synchrone et Asynchrone simultanément

bigzooloo

Bonjour,

Le problème que j'ai n'est pas spécifique à Windows, j'utilise boost::asio pour une connexion client / serveur (donc portable sur linux et autre), mais peut importe, ca aurait pu etre winsock...

Voici ce que j'essai de faire :

Le client envoi une requête au seveur et attend une réponse "aussitôt" pour continuer => j'utilise donc ici write/read de façon synchrone.

Le serveur lui, attend une requette de l'un des clients de façon asynchrone et traite la demande pour lui renvoyer la réponse => read_async/write_async

Jusqu'ici, pas de problème.

Sauf que parfois, j'ai besoin que le serveur prévienne tous les clients qu'il a effectué une action particulière.

Le serveur connait la liste des clients et envoi les messages correspondants.

Le problème est que je n'arrive pas à récupérer ces messages dans le client...

J'ai tenter ceci pour le client : (en pseudo-code)

write( request );  // j'envoi ma demande
read( response );  // j'attend la réponse avant de continuer

// traitement de la response

read_async ( callback_func );

// j'aimerai bien que callback_func soit appellée si on
// m'envoi des données sans rien demander
// mais je ne veux pas bloquer l'execution du programme...


Mais forcément, pendant l'attente async, il se peut que je fasse une autre demande.
Première question : est-ce correcte de faire un write alors qu'un read_async est en cours ?

Actuellement, avec cette solution, callback_func n'est jamais appelée, par contre avec un read synchrone je reçois bien les données du serveur.

Quelle solution serait plus appropriée ?

Merci.
mardi 6 janvier 2009 à 13:51:04 | Re : Utilisation socket Synchrone et Asynchrone simultanément

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

Tu as songé à faire un deuxième thread et une deuxième socket sur un autre port ? Evidement, c'est lourd...
mardi 6 janvier 2009 à 14:00:11 | Re : Utilisation socket Synchrone et Asynchrone simultanément

bigzooloo

Merci de ta réponse.
J'ai déjà 2 types de sockets : une "normale" et une contenue dans un flux SSL pour un cryptage 1024 bits. L'utilisateur à le choix entre les deux (une seule est active à la fois bien sur).

Ce qui me donne déjà 2 sockets par client sur le serveur... effectivement, on pourrai penser à les dupliquer... mais bon, je pense quand même qu'il doit y avoir une solution moins "lourde".
mardi 6 janvier 2009 à 15:44:31 | Re : Utilisation socket Synchrone et Asynchrone simultanément

bigzooloo

Réponse acceptée !
J'ai trouvé comment recevoir les données en asynchrone avec cette méthode : il faut lancer un "service" de gestion des evènements pour le callback.
Ce service doit cependant être dans un thread pour ne pas bloquer le programme.

Avec boost, cela se fait de cette façon :

thread_ = new boost::thread(boost::bind(&boost::asio::io_service::run, &io_service_));

Sauf que voila, maintenant, mon read synchrone lit une partie des données et le read_async récupère l'autre...

Donc, je peux répondre à ma première question : il est tout à fait possible de faire un write alors d'un thread est en attente de lecture sur la même socket.

Et donc finalement, pour résoudre mon problème, j'ai tout passé en asynchrone :

write( request );  // j'envoi ma demande
semaphore.wait();  // j'attend d'avoir recu la réponse
// traitement de la response

et dans "callback_func" je test si c'est la réponse à ma requete ou si c'est une réponse non solicitée.

callback_func()
{
  if (
reponse à ma requete )
   
semaphore.post();   // je préviens le thread principal
  else
    // autre traitement
}

Et voila



Cette discussion est classée dans : serveur, envoi, client, read, synchrone


Répondre à ce message

Sujets en rapport avec ce message

Envoi de fichier d'un client vers un serveur [ par kanagan ] Salut à tous.Voilà, je dois réaliser un programme (enfin 2: un client et un serveur) en C++ sous Viual C++ 6.Le but: Le client (sur un pc) doit envoye FD_READ [ par argali ] Bonjour,J'ai un probleme avec FD_READ qui n'est pas appele lorsque mon client envoie un message au serveur, FD_WRITE marche par contre et le serveur p Projet Client / Server [ par atifelkhachine ] Salut :)j sais pas si quelq un peu m aider a propos de ce debut de mon projet.voila :je v realiser une application Client / serveur.je veux le faire s Communication Client/Serveur ! Ou es le problème ? [ par QuakeCoder ] Je recentre fréquemment un problème avec l’utilisation de socket et la communication entre Client/Server.   Prenant un exemple de ma dernière appl envoi d'un ping entre 2 client. [ par ahmadou006 ] Bonjour a tous, Au fait j'ai fait une connexion client/serveur via Socket "les client communique entre eux sans passer par le serveur là je c pas comm securite dans objectiv-C : comment envoyer une clé RSA secKeyRef à un serveur JAVA [ par grandesaucisse ] bonjour, voila je développe une application pour I Phone (donc avec objectiv-C) permettant de se connecter à un web-service (en java) de manière sécu Client Serveur OPC avec MFC vc6 [ par DEHHAK ] salam en fait je suis un debutant en informatique et j'ai developper deux applications MFC AppWizard sous vc++ et il y'a des variable qui sont exploi Programme sur les sockets en c++ builder 6 [ par fahdmustapha ] salut, j'aimerai avoir le code source de deux programmes en c++ builder 6 (serveur et client). le client:contien trois composants TClientSocket, TButt Communication impossible client-serveur [ par Indo23 ] Bonsoir à tous le monde, Voila, j'ai un problème, j'ai un client et un serveur qui doivent communiquer et s'échanger des fichiers texte, cependant, j socket en C sous Qt [ par taifone ] je developpe une application client/serveur en C.Le client est une interface graphique en Qt et le serveur est un programme serveur.c sous linux j'ai


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales