Membres inscrits :2359
Membres en ligne : 0
Invités en ligne : 5


|
Conversation : Communcation entre process |
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)
|
|
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)
|
|
|