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

Langage C++ Discussion :

communication inter-processus windows


Sujet :

Langage C++

  1. #1
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut communication inter-processus windows
    Bonjour à tous,

    Je suis ammené à développer sous visual studio une solution de deux logiciel qui doivent communiquer ensemble:
    Un premier (nommé "service") qui est lancé en service windows et qui fait tout un tas de truc.
    Un deuxieme (nommé "application") en application qui fait aussi tout un tas de chose.

    Je dois instauré une communication entre ces deux processus sachant que l'utilisateur ne garanti pas la longévité des deux solutions (elles peuvent s’arrêter et redémarrer n'importe quand).
    La communication se fait que dans un sens: l'application envois des demandes au service pour effectué une tache sans attendre de retour.

    J'ai commencé par implémenter une solution de NamedPipe mais je me rend compte que ce n'est pas adapté:
    Le pipe se retrouve détruit si une application cesse.
    Le pipe serait créer par l'application et le service se connecte dessus pour recevoir des données sauf que si l'application redémarre, le pipe se retrouve cassé et donc ne fonctionne plus.
    Je ne peux pas non plus utiliser les socket car cela implique une connexion constante entre les deux solutions.

    Je me demande donc quelle serait la meilleur solution, j'ai vu que l'on pouvait utiliser le fileMapping, est-ce une bonne solution? le problème que je vois avec cette solution est la file d'attente, il ne faut pas que le service exécute les actions en attente dans le fichier.

    Je comptais d'abord utiliser un système de signaux sauf que je ne connais pas le pid du service, donc impossible d'envoyer un signal.

    N'éxiste-t-il pas sous windows une solution toute simple pour envoyer un signal à un service windows afin qu'il effectue une tache périodique?

    Toute aide est la bienvenue .
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Normalement, c'est bien le Named Pipe (ou à la rigueur socket) qu'il faut, créé par le service, et l'appli s'y connecte.
    Ensuite, rien ne dit que l'appli doit maintenir une connexion permanente, plutôt que se connecter au service à chaque requête...
    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.

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    as-tu regardé du côté de boost interprocess?
    Il y a plusieurs solutions envisageables (mémoire partagé, fichiers partagés, avec différents types de locks, mutexes, etc.).
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    J'ai trouvé une meilleur solution en utilisant le ControlHandler des service windows, le test fonctionne bien par contre mon handler intercepte aussi les demande d'arret et de pause du service, sauriez-vous par hasard comment faire pour qu'il n'intercepte que les control user? (128 à 256). Ou sinon comment appeler le handler par défault du service?
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce que tu dis signifie que tu as implémenté ton service en utilisant un framework qui contient le vrai ControlHandler; la réponse dépend du framework utilisé...
    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.

  6. #6
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    J'ai finalement trouvé une solution en mettant ma fonction longue du service dans un thread et en implémentant les différent signaux possible dans mon handler, voici le code utilisé pour ceux que ça interesse:

    utilitaire pour envoyer un signal 129 à un service nommé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    std::string GetLastErrorStdStr(DWORD error)
    {
      if (error)
      {
        LPVOID lpMsgBuf = 0;
        DWORD bufLen = FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            error,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR) &lpMsgBuf,
            0, NULL );
        if (bufLen)
        {
          LPCSTR lpMsgStr = (LPCSTR)lpMsgBuf;
          std::string result(lpMsgStr, lpMsgStr+bufLen);
     
          LocalFree(lpMsgBuf);
     
          return result;
        }
      }
      return std::string("?????");
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	SERVICE_STATUS ssStatus;
    	LPTSTR app_name_long = _T("nomduservice");
    	SC_HANDLE schManager;
    	SC_HANDLE schService;
    	if ((schManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT)) != NULL)
    		if ((schService = OpenService(schManager, app_name_long, SERVICE_USER_DEFINED_CONTROL)) != NULL)
    		{
    			std::cout << "sending control" << std::endl;
    			if (ControlService(schService, 129, &ssStatus))
    				std::cout << "succes" << std::endl;
    			else
    				std::cout << "ControlService failed" << std::endl;
    		}
    		else
    			std::cout << "openservice failed" << std::endl;
    	else
    		std::cout << "openscmanager failed" << std::endl;
    	DWORD numError = GetLastError();
    	std::cout << "last error = " << numError << std::endl;
    	std::string error = GetLastErrorStdStr(numError);
    	std::cout << error.c_str() << std::endl;
    	CloseServiceHandle(schService);
    	CloseServiceHandle(schManager);
    	system("PAUSE");
    	return (0);
    }
    et le code coté service :
    dans le main du service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RegisterServiceCtrlHandlerEx(app_name_long, ServiceControlHandler, lpContext);
    la fonction de reception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    DWORD WINAPI ServiceControlHandler(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
    {
    	if (dwControl == 129)
    	{
    		CreateThread( 
                NULL,                   // default security attributes
                0,                      // use default stack size  
                TraitementThread,       // thread function name (correspond au thread effectuant la tache)
                lpContext,          // argument to thread function 
                0,                      // use default creation flags 
                0); 
    		return (0);
    	}
    	else if (dwControl == SERVICE_CONTROL_STOP)
    		StopService();
    	else if (dwControl == SERVICE_CONTROL_INTERROGATE)
    		return (0);
    	else
    		// log d'un code ne correspondant à rien de ce qu'on gère
    	return (0);
    }
    Je passe le sujet en résolu étant donné que j'ai une solution fonctionnelle .

    Merci de votre aide .
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


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

Discussions similaires

  1. Communication inter-processus et pause()
    Par jsebfranck dans le forum POSIX
    Réponses: 10
    Dernier message: 14/02/2008, 14h52
  2. [windows] Communication inter-processus
    Par litbos dans le forum Windows
    Réponses: 6
    Dernier message: 16/01/2007, 09h13
  3. [Perl] communication Inter-Processus
    Par MarneusCalgarXP dans le forum Langage
    Réponses: 15
    Dernier message: 14/08/2006, 22h43
  4. [débutant] Communication inter-processus
    Par tooney dans le forum C
    Réponses: 3
    Dernier message: 29/12/2005, 20h48
  5. communication inter-processus
    Par benoit70 dans le forum MFC
    Réponses: 1
    Dernier message: 14/04/2005, 09h55

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