wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 1

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» Communcation entre process
Conversation : Communcation entre process
11-12-2009 15:49:08  Communcation entre process #1
Snark (Nouveau membre)
Inscrit le : 11-12-2009
Messages: 1
Snippets: 0
Tutoriels: 0
Hors ligne
Bonjour à tous,

J'ai déjà posé cette question sur le forum officiel des wxWdigets, mais étant donnée le manque de réponse, et que je me casse la tête depuis 2 jours dessus, je me permet de la poser également ici :).
Je souhaite utilise la communcation entre process de wxWidgets pour ne générer qu'une seule instance de mon programme, mais passer les paramètres des autres instance à l'instance principale.

Pour cela, je me suis dirigé vers la communication inter-process des wx à l'aide de wxConnection/wxServer/wxClient.
Après avoir bien suivi la doc ( http:/docs.wxwidgets.org/trunk/overview_ipc.html ), j'ai écrit un petit programme de test. Mais bien que l'exemple IPC des wx fonctionne, je n'arrive pas à faire fonctionner le miens. Ce doit être un petit truc quelque part, mais je ne trouve pas.
L'appel à MakeConnection du client me renvoi toujours NULL.

Voici ma petite application d'exemple:

Code Cpp:

#include <wx/app.h>
#include <wx/log.h>
#include <wx/snglinst.h>
#include <wx/ipc.h>
#include <wx/msgdlg.h>
#include <wx/dialog.h>
#include <iostream>
 
#define IPC_TOPIC wxT("myapp")
#define IPC_NAME wxT("myapp.ipc")
 
// Connection class, for use by both communicating instances
class stConnection : public wxConnection
{
    public:
        stConnection(): wxConnection() {}
        ~stConnection() {}
        bool OnExecute(const wxString& topic, wxChar*data, int size, wxIPCFormat format)
        {
            std::cout << "OnExecute" << std::endl;
            wxString filename(data);
            std::cout << "Receive: " << filename << std::endl;
            return true;
        }
 
};
 
// Server class, for listening to connection requests
class stServer: public wxServer
{
    public:
        stServer(): wxServer() {}
        wxConnectionBase *OnAcceptConnection(const wxString& topic)
        {
            std::cout << "OnAcceptConnection" << std::endl;
            if (topic.Lower() == IPC_TOPIC)
            {
                return new stConnection();
            }
 
            return NULL;
        }
};
 
// Client class, to be used by subsequent instances in OnInit
class stClient: public wxClient
{
    public:
        stClient(): wxClient() {};
        wxConnectionBase *OnMakeConnection() { std::cout << "OnMakeConnection" << std::endl; return new stConnection; }
};
 
class MyApp: public wxApp
{
    protected:
        wxSingleInstanceChecker* m_singleInstanceChecker;
        stServer* m_server;
 
    public:
        bool OnInit()
        {
            m_singleInstanceChecker = new wxSingleInstanceChecker(wxT("ipc-test"));
            if (!m_singleInstanceChecker->IsAnotherRunning())
            {
                // Create a new server
                m_server = new stServer;
                if ( !m_server->Create(IPC_NAME) )
                {
                    wxLogDebug(wxT("Failed to create an IPC service."));
                    delete m_singleInstanceChecker;
                    return false;
                }
                else
                {
                    std::cout << "IPC server starting." << std::endl;
                    wxDialog* d = new wxDialog(NULL, wxID_ANY, wxT("Server"));
                    d->Show();
                }
            }
            else
            {
//                wxLogNull logNull;
                stClient* client = new stClient;
                wxConnectionBase* connection = client->MakeConnection(wxEmptyString, IPC_NAME, IPC_TOPIC);
                if (connection)
                {
                    std::cout << "IPC client starting." << std::endl;
                    connection->Execute("test_file.txt");
                    connection->Disconnect();
                    delete connection;
                }
                else
                {
                    wxMessageBox(wxT("Sorry, the existing instance may be too busy too respond.\nPlease close any open dialogs and retry."), wxT("My application"), wxICON_INFORMATION|wxOK);
                }
                delete client;
                delete m_singleInstanceChecker;
                return false;
            }
 
            return true;
        }
 
        int OnExit()
        {
            delete m_singleInstanceChecker;
        }
};
 
IMPLEMENT_APP(MyApp)
 


Si quelqu'un à une idée là dessus.
PS: Je suis sous Linux, je ne l'ai pas testé sous Windows.

Merci beaucoup.
Snark
----------
Ok, merci pour les réponses ! ;p

J'ai cherché tout le week-end, et j'ai trouvé, c'était un truc con:

Code Cpp:

#define IPC_NAME wxT("myapp.ipc")

devient:

Code Cpp:

#define IPC_NAME wxT("4242")


Et là, ça fonctionne. Le faîte est que tout simplement, sous nux, il utilise le TPC/IP, donc il veut obligatoirement un numéro de port.

Par contre, petites questions:
- N'est-t-il pas possible de limité l'écoute du port pour le localhost, uniquement ? Parce que, question sécurité, ça craint.
- Pourquoi ce système n'utilise-t-il pas plutôt les pipes, sous Linux ? Ça serait franchement plus propre. Et n'est-t-il pas possible d'implémenter une version avec pipe ? (Je n'ai pas regardé comment était fait les IPC, donc c'est une question ouverte)

Dernière modification par Snark (14-12-2009 14:46:56)

15-12-2009 23:52:50  Re: Communcation entre process #2
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne
Salut,

Je pense qu'il n'utilise pas les pipe sous UNIX pour des raisons de portabilité ca leur évite d'avoir a implémenter les pipes juste pour ce système alors que les sockets sont compatible de partout et plus simple d'utilisation a priori.
Sinon si tu as un pare feu je pense que ca ne crain(s)(t) pas plus que ca il me semble ?

Voilà @+

Dernière modification par Warzer (16-12-2009 00:01:39)

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» Communcation entre process