Utilisation socket Synchrone et Asynchrone simultanément

Résolu
bigzooloo Messages postés 36 Date d'inscription jeudi 16 mai 2002 Statut Membre Dernière intervention 6 octobre 2009 - 6 janv. 2009 à 09:38
bigzooloo Messages postés 36 Date d'inscription jeudi 16 mai 2002 Statut Membre Dernière intervention 6 octobre 2009 - 6 janv. 2009 à 15:44
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.

3 réponses

bigzooloo Messages postés 36 Date d'inscription jeudi 16 mai 2002 Statut Membre Dernière intervention 6 octobre 2009
6 janv. 2009 à 15:44
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
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 janv. 2009 à 13:51
Salut,

Tu as songé à faire un deuxième thread et une deuxième socket sur un autre port ? Evidement, c'est lourd...
0
bigzooloo Messages postés 36 Date d'inscription jeudi 16 mai 2002 Statut Membre Dernière intervention 6 octobre 2009
6 janv. 2009 à 14:00
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".
0
Rejoignez-nous