Accueil > Forum > > > > besoin d'aide pour connection multi socket
besoin d'aide pour connection multi socket
mardi 23 décembre 2003 à 21:22:16 |
besoin d'aide pour connection multi socket

JRB
|
j'ai developpe un petit programme de chat sur visual C++ 6.0 a partir d'un programme existant mais ne gerant que 2 connections. mon but etait de l'etendre a un plus grand nombres de connections mais j'ai un probleme au point de vue des sockets . les 2 premieres fenetres peuvent se connecter ensemble mais la troisieme ne peut communiquer avec personne. les sockets pour cette dernieres sont pourtant bien creer et initialiser mais le serveur ne veut pas les utiliser. pouvez vous e dire si j'ai oublie quelque chose ou si j'ai fait une erreur quelque part. merci d'avance pour l'aide car je n'arrive pas à me debloquer tout seul.
|
|
mardi 23 décembre 2003 à 21:34:47 |
Re : besoin d'aide pour connection multi socket

aardman
|
Salut, Comment veux tu qu'on sache si tu as oublié quelque chose ou si tu as fait une erreur quelque part si tu nous donne pas le bout de code qui gere les sockets ?
|
|
mercredi 24 décembre 2003 à 14:24:21 |
Re : besoin d'aide pour connection multi socket

JRB
|
excuser l'oubli je n'avais pas realiser voici le fichier ReseauDlg.h // ReseauDlg.h : header file //
#if !defined(AFX_RESEAUDLG_H__DA3A9147_2BEA_11D4_8BEE_00201854D64E__INCLUDED_) #define AFX_RESEAUDLG_H__DA3A9147_2BEA_11D4_8BEE_00201854D64E__INCLUDED_
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000
#include "ClasseSocket.h"
///////////////////////////////////////////////////////////////////////////// // CReseauDlg dialog
class CReseauDlg : public CDialog { // Construction
public: void OnConnect(); void OnSend(); void OnReceive();private: bool m_bConnection; bool m_bConnectionEstablished; bool m_bConnection2Established; CClasseSocket m_ServerSocket; CClasseSocket m_Server2Socket; CClasseSocket m_ClientSocket; CClasseSocket m_Client2Socket; void OnClose(); void OnAccept(); CReseauDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data //{{AFX_DATA(CReseauDlg) enum { IDD = IDD_RESEAU_DIALOG }; CButton m_ctrlConnexion; CListBox m_ctrlTexte; CString m_strExpedier; BOOL m_blsServeur; CString m_strNomServeur; int m_iPortServeur; //}}AFX_DATA
// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CReseauDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL
// Implementation protected: HICON m_hIcon;
// Generated message map functions //{{AFX_MSG(CReseauDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnConnexion(); afx_msg void OnServeur(); afx_msg void OnEnvoyer(); //}}AFX_MSG DECLARE_MESSAGE_MAP() };
//{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_RESEAUDLG_H__DA3A9147_2BEA_11D4_8BEE_00201854D64E__INCLUDED_)
// ReseauDlg.cpp : implementation file //
#include "stdafx.h" #include "Reseau.h" #include "ReseauDlg.h"
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About
class CAboutDlg : public CDialog { public: CAboutDlg();
// Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA
// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL
// Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() };
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT }
void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// // CReseauDlg dialog
CReseauDlg::CReseauDlg(CWnd* pParent /*=NULL*/) : CDialog(CReseauDlg::IDD, pParent) { //{{AFX_DATA_INIT(CReseauDlg) m_strExpedier = _T(""); m_blsServeur = FALSE; m_strNomServeur = _T(""); m_iPortServeur = 0; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
void CReseauDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CReseauDlg) DDX_Control(pDX, IDC_CONNEXION, m_ctrlConnexion); DDX_Control(pDX, IDC_TEXTE, m_ctrlTexte); DDX_Text(pDX, IDC_EXPEDIER, m_strExpedier); DDX_Check(pDX, IDC_SERVEUR, m_blsServeur); DDX_Text(pDX, IDC_NOMSERVEUR, m_strNomServeur); DDX_Text(pDX, IDC_PORTSERVEUR, m_iPortServeur); //}}AFX_DATA_MAP }
BEGIN_MESSAGE_MAP(CReseauDlg, CDialog) //{{AFX_MSG_MAP(CReseauDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_CONNEXION, OnConnexion) ON_BN_CLICKED(IDC_SERVEUR, OnServeur) ON_BN_CLICKED(IDC_ENVOYER, OnEnvoyer) //}}AFX_MSG_MAP END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// // CReseauDlg message handlers
BOOL CReseauDlg::OnInitDialog() { CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } }
// Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here m_blsServeur = false; m_strNomServeur = _T("localhost"); m_iPortServeur = 1000; m_ServerSocket.SetParentWindow(this); m_Server2Socket.SetParentWindow(this); m_ClientSocket.SetParentWindow(this); m_Client2Socket.SetParentWindow(this); m_bConnection = false; m_bConnectionEstablished=false; m_bConnection2Established=false; UpdateData(false); return TRUE; // return TRUE unless you set the focus to a control }
void CReseauDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } }
// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework.
void CReseauDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } }
// The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CReseauDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; }
void CReseauDlg::OnServeur() { // TODO: Add your control notification handler code here // Lire les données actuelles UpdateData(true);
// Cette instance fera-t-elle office de serveur ? if (m_blsServeur) { // Oui, changer le texte du bouton m_ctrlConnexion.SetWindowText("&Attente client");
// Désactiver les champs serveur GetDlgItem(IDC_NOMSERVEUR)->EnableWindow(false); GetDlgItem(IDC_PORTSERVEUR)->EnableWindow(false); } else { // Non, changer le texte du bouton m_ctrlConnexion.SetWindowText("&Connexion au serveur");
// Activer les champs serveur GetDlgItem(IDC_NOMSERVEUR)->EnableWindow(true); GetDlgItem(IDC_PORTSERVEUR)->EnableWindow(true); } }
void CReseauDlg::OnConnexion() { // TODO: Add your control notification handler code here // Acquérir les valeurs actuelles UpdateData(true);
// Déjà connecté ? if (!m_bConnection) { // Non, désactiver l'élément correspondant GetDlgItem(IDC_NOMSERVEUR)->EnableWindow(false); GetDlgItem(IDC_PORTSERVEUR)->EnableWindow(false); GetDlgItem(IDC_SERVEUR)->EnableWindow(false);
// L'instance est-elle un serveur ? if (m_blsServeur) { // Oui, attendre la connexion m_ServerSocket.Create(1000); m_ServerSocket.Listen();
} else { if (m_iPortServeur == 1) { // Non, tenter d'établir la connexion par le client 1 m_ClientSocket.Create(); m_ClientSocket.Connect(m_strNomServeur, 1000);
// Modifier l'inscription de connexion m_ctrlConnexion.SetWindowText( "&Déconnexion"); } else { // Non, tenter d'établir la connexion par le client 2 m_Client2Socket.Create(); m_Client2Socket.Connect(m_strNomServeur, 1000);
// Modifier l'inscription de connexion m_ctrlConnexion.SetWindowText( "&Déconnexion"); } }
// Noter qu'une connexion existe m_bConnection = true; } else { // Une connexion existait, en creer une autre m_Server2Socket.Create(1000); m_Server2Socket.Listen(); MessageBox("deja connecte !"); } }
void CReseauDlg::OnAccept() { if (!m_bConnectionEstablished) { // Accepter la connexion du 1er client m_ServerSocket.Accept(m_ClientSocket); // Activer les contrôles correspondants GetDlgItem(IDC_TEXTE)->EnableWindow(true); GetDlgItem(IDC_EXPEDIER)->EnableWindow(true); GetDlgItem(IDC_ENVOYER)->EnableWindow(true); m_bConnectionEstablished=true; MessageBox("connection1 !"); } else { // Accepter la connexion de 2eme client m_Server2Socket.Accept(m_Client2Socket); // Activer les contrôles correspondants GetDlgItem(IDC_TEXTE)->EnableWindow(true); GetDlgItem(IDC_EXPEDIER)->EnableWindow(true); GetDlgItem(IDC_ENVOYER)->EnableWindow(true); m_bConnection2Established=true; MessageBox("connection2 !"); } }
void CReseauDlg::OnConnect() { // Activer les contrôles correspondants GetDlgItem(IDC_TEXTE)->EnableWindow(true); GetDlgItem(IDC_EXPEDIER)->EnableWindow(true); GetDlgItem(IDC_ENVOYER)->EnableWindow(true); MessageBox("connection2 !"); }
void CReseauDlg::OnEnvoyer() { // TODO: Add your control notification handler code here // Se procurer les données actuelles UpdateData(true);
// Lire la chaîne du contrôle CString strTemp = m_strExpedier;
// Cette instance est-elle le serveur ? if (m_blsServeur) { // Placer le préfixe strTemp = "Server1: " + strTemp; if (!m_bConnection2Established) //////////////////////////////////// { // Se procurer la longueur de la chaîne int nSize = strTemp.GetLength();
// Envoyer la chaîne par le 1er client int nResult = m_ClientSocket.Send(LPCTSTR(strTemp), nSize);
// une erreur s'est-elle produite ? if (SOCKET_ERROR == nResult) { // Oui, afficher message MessageBox("Erreur lors de l'envoi du texte !"); } else { // Non, ajouter le texte à la ListBox m_ctrlTexte.AddString(strTemp); } /////////////////////////////////////////////////////////////////////// } else { // Se procurer la longueur de la chaîne //////////////////////////////////////// int nSize = strTemp.GetLength();
// Envoyer la chaîne par le 1er client int nResult = m_Client2Socket.Send(LPCTSTR(strTemp), nSize);
// une erreur s'est-elle produite ? if (SOCKET_ERROR == nResult) { // Oui, afficher message MessageBox("Erreur lors de l'envoi du texte !"); } else { // Non, ajouter le texte à la ListBox m_ctrlTexte.AddString(strTemp); } //////////////////////////////////////////////////////////////////////// } } else { // Placer le préfixe //************************************************************ strTemp = "Client1: " + strTemp; if (m_iPortServeur == 1) { // Se procurer la longueur de la chaîne int nSize = strTemp.GetLength();
// Envoyer la chaîne par le 1er client int nResult = m_ClientSocket.Send(LPCTSTR(strTemp), nSize);
// une erreur s'est-elle produite ? if (SOCKET_ERROR == nResult) { // Oui, afficher message MessageBox("Erreur lors de l'envoi du texte !"); } else { // Non, ajouter le texte à la ListBox m_ctrlTexte.AddString(strTemp); } } //*********************************************************************************** else { // Se procurer la longueur de la chaîne //******************************************* int nSize = strTemp.GetLength();
// Envoyer la chaîne par le 1er client int nResult = m_Client2Socket.Send(LPCTSTR(strTemp), nSize);
// une erreur s'est-elle produite ? if (SOCKET_ERROR == nResult) { // Oui, afficher message MessageBox("Erreur lors de l'envoi du texte !"); } else { // Non, ajouter le texte à la ListBox m_ctrlTexte.AddString(strTemp); } } //************************************************************************************ }
// Actualiser les données des contrôles UpdateData(false); }
void CReseauDlg::OnSend() { // Méthode intentionnellement vide }
void CReseauDlg::OnReceive() { // Créer les variables locales char pText[1024]; CString strTemp;
// Recevoir la chaîne int nResult = m_ClientSocket.Receive(pText, 1024);
// une erreur s'est-elle produite ? if (SOCKET_ERROR == nResult) { // Oui, afficher un message MessageBox ("Erreur à la réception du texte !"); int nResult = m_Client2Socket.Receive(pText, 1024); // Ajouter un NULL à la chaîne reçu (désigne // la fin de la chaîne) pText[nResult]=NULL; // Copier le text dans la variable CString strTemp = pText;
// Ajouter le texte à la ListBox m_ctrlTexte.AddString(strTemp); } else { // Ajouter un NULL à la chaîne reçu (désigne // la fin de la chaîne) pText[nResult]=NULL; // Copier le text dans la variable CString strTemp = pText;
// Ajouter le texte à la ListBox m_ctrlTexte.AddString(strTemp); } }
void CReseauDlg::OnClose() { // Fermer la conexion m_ClientSocket.Close();
// Il n'existe plus de connexions (concerne le serveur) m_bConnectionEstablished=false;
// Activer et désactiver les contrôles de manière appropriée GetDlgItem(IDC_TEXTE)->EnableWindow(false); GetDlgItem(IDC_EXPEDIER)->EnableWindow(false); GetDlgItem(IDC_ENVOYER)->EnableWindow(false); GetDlgItem(IDC_SERVEUR)->EnableWindow(true);
// Se procurer les données actuelles UpdateData(true);
// Quelques modifications ne concernant que le client if (!m_blsServeur) { // Activer, désactiver et initaliser les contrôles GetDlgItem(IDC_NOMSERVEUR)->EnableWindow(true); GetDlgItem(IDC_PORTSERVEUR)->EnableWindow(true); m_ctrlConnexion.SetWindowText("&Connexion au serveur"); } }
|
voila tout le code source le deuxieme est celui qui gere tout. mailez moi si vous voulez les autres fichiers mon adresse e-mail : jrbr@ifrance.com
|
|
mercredi 24 décembre 2003 à 15:36:42 |
Re : besoin d'aide pour connection multi socket

aardman
|
Salut, Il fallais aussi préciser que c'etait en MFC... désolé je ne peux pas t'aider.
|
|
vendredi 26 décembre 2003 à 15:33:35 |
Re : besoin d'aide pour connection multi socket

MoDDiB
|
J'ai rien lu de ton code parcque tu n'as pas trop ciblé le probleme mais .. le probleme ne viendré pas des threads?
|
|
vendredi 26 décembre 2003 à 18:22:05 |
Re : besoin d'aide pour connection multi socket

JRB
|
en clair mon probleme est que mon programme de chat marche avec 2 clients mais pas avec 3 ou plus.
en fait je n'arrive pas a situer l'erreur et c'est pour sa que je demande de l'aide
|
|
vendredi 26 décembre 2003 à 18:31:44 |
Re : besoin d'aide pour connection multi socket

aardman
|
Salut, Normalement dans un serveur multiclient on stocke tout les sockets dans un tableau. La j'ai vu aucun tableau, juste: CClasseSocket m_ClientSocket; CClasseSocket m_Client2Socket;
A mon avis il va falloir tout retravailler pour accepter plus de deux connections.
|
|
lundi 29 décembre 2003 à 13:27:31 |
Re : besoin d'aide pour connection multi socket

JRB
|
Le probleme n'est pas la je ne cherche pas a faire un programme qui marche du premier coup, pour l'instant j'essaie surtout de comprendre l'utilisation des sockets. La forme n'a que peu d'importance pour le moment. Normalement le code que j'ai ecrit devrait fonctionner correctement meme si je n'ai pas utilise de tableau, la procedure est correcte. Tout se passe bien jusqu'a l'envoie des donnees et c'est la que je ne comprend plus et c'est pour cette partie justement que j'aimerais quelques conseils parceque je comprend pas la reaction du code. Pour la forme je la reverrais une fois que j'aurais compris le probleme.
|
|
Cette discussion est classée dans : aide, programme, connection, socket, multi
Répondre à ce message
Sujets en rapport avec ce message
aide pour faire un programme [ par changina ]
quelqu'un pourrais t'il m'aider à faire un programme qui réssoud une equation du second degré?meci d'avance
aide pour faire un programme [ par djmp3 ]
Je suis débutant en programmation et je n'arrive pas à réaliser l'algo et le prog en C.Pourriez vous m'aider?Donnée du problème:Trouver le plus petit
AIDE programme supprimer un fichier ! SVP [ par nico ]
salut à tous,je suis un gros nul en c++ , je viens de telecharger dev-c++ et j'aimerais faire mon premier programe tout simple pour supprimer un fichi
AIDE SVP ! Programme qui délogue l'utilisateur [ par guilt92 ]
Bonjour.Je voudrais réaliser un programme, qui, sous NT, ferme la session d'un utilisateur si la session reste verouillée trop longtemps ou si l utili
Recherche programme lecture Socket [ par DarknessLucifer ]
Besoin d'un programme permettant de lire les informations Socket .. je travail sous windows.Si qq avait un programme fonctionnant je lui en serait tre
aide en C svp [ par asnow ]
Bonjour, Je debut en C. Est-ce que pour mieux m'aider à comprendre une personne peut me faire un programme en c, qui demande à une personne de s'enre
aide en ligne d'un programme perso [ par Tutu ]
Bonjour à tous.Voilà je voudrais savoir comment faire pour créer une aide perso ? Que faut-il faire ? Et comment l'insérer dans une applic (genre SDI)
DEMANDE AIDE: aide sur socket, server proxy et spoof [ par retaks666 ]
je voudrai savoir si en etudaint les sockets, je pourrai creer un serveur proxy ki renvoie une fausse ip, par exemple cela pourrai servir de spoofer s
pb socket [ par surfeurnet ]
voici mon programme qui a pour l'instant pour unique but de se connecter à un serveur :# include # include # pragma comment (lib,"w32_32.lib")char ip,
HOWTO: non-blocking socket [ par anthraxx ]
Salut tt le mondeJ'ai commencé un programme qui crée un socket UDP et qui ecoute en faisant des loop de recvfrom().Seulement, comme l'indique a juste
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|