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

C++ Discussion :

Probleme de synchronisation ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut Probleme de synchronisation ?
    EDIT : nouveau probleme

    Bonjour, je continue dans mon exercice sur les tubes nommées ...

    Je rapelle la chose :
    j'ai un prog "serveur", qui attribue a chaque tuilisateur connu, un pipe a sa création
    J'ai un prog client ( qui peut être lancé plusieur fois en meme temps )
    et qui doit envoyé/recevoir des info avec le serveur.

    J'utilise un seule tube dans la direction Client -> Serveur .
    Aucun probleme jusqu'a présent .

    Par contre, ma dernière fonction doit être capable d'envoyer des donnée du serveur au clients . Et la je bloque :/ J'ai essayé de plusieur manière différente mais ca en passe pas .

    Ce que je pensais faire :
    -utiliser le tube principale pour indiquer au server que tel client veux tel information ( ca, ca marche )
    - envoyez par le tube personaliser du client, l'information
    - lire cette info du coté client .

    Mais .... non, il ne veux absolument pas :/

    j'utilise les tube nommée en WIN32 ( CreateNamedPipe() ) .

    Voici ma fonction principale du serveur, qui attend une requete
    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
     
    // Fonction permettant au serveur de recevoir et d'envoyez des messages aux clients .
    void Listen()
    {
    	std::cout << "Le serveur est actif ... " << std::endl ;
     
    	// On attend que quelqu'un se connecte 
    	for(;;)
    	{
    		// Le buffer qui va recevoir les données
    		CHAR Data[4096]; 
     
    		// Le nombre de bytes lu
    		DWORD BytesRead = 0 ;
     
    		// On attend qu'un utilisateur fasse une requête
    		BOOL fConnected = ConnectNamedPipe(HandleList["Main"],NULL);
     
    		// Si il y a des donnée a lire, on les récupère puis les traite .
    		if ( fConnected )
    		{
    			BOOL fSuccess = ReadFile (HandleList["Main"] ,       // handle to pipe 
    									                Data ,       // buffer to receive data 
    													4096 ,       // size of buffer 
    													&BytesRead,  // number of bytes read 
    													NULL);       // not overlapped I/O 
     
    			Data[BytesRead] = '\0';
    			FlushFileBuffers(HandleList["Main"]); 
    			DisconnectNamedPipe(HandleList["Main"]); 
    		}
     
    		// On traite les données
    		ProcessData(Data);
    	}
    }
    Voici une partie de la fonction de traitement des donnée niveau serveur
    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
     
    // Fonction qui traite les demandes utilisateur
    void ProcessData(std::string Data)
    {
    	// On découpe notre string Keyword - Argeument
    	std::string Keyword ;
    	std::string Arg ;
    	std::string::size_type pos ;
    	pos = Data.find_first_of(" ");
    	Keyword.insert(0,Data,0,pos);
    	Arg.insert(0,Data,pos+1,Data.size()+1);
     
    	// Si on a une demande de consultation de mail, on envoie a l'utilisateur ses nouveaux message .
    	if ( Keyword == "GetMail" )
    	{
    		// Le buffer qui va recevoir les données
    		CHAR Data2[4096] = "voila tes mails" ;
     
    		// Le nombre de bytes lu
    		DWORD BytesSend = 0 ;
     
    		std::cout << "Requete de mail de : " << Arg << std::endl ; 
     
    		BOOL fSuccess = WriteFile (HandleList[Arg] ,       // handle to pipe 
    									            Data2 ,       // buffer to receive data 
    												4096 ,       // size of buffer 
    												&BytesSend,  // number of bytes read 
    												NULL);       // not overlapped I/O 
    	}
    Enfin la fonction appelé par l'utilisateur
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    // Fonction permettant de consulter sa boite de mail .
    void MailBox()
    {
    	// Des paramètre de notre pipe .
    	DWORD dwWrite;
    	char szPipeUpdate[4096];
     
    	// Notre message a envoyé
    	std::string Message = "GetMail " + LoginName ;
     
    	// On attend que le pipe soit libre .
    	WaitNamedPipe("\\\\.\\pipe\\PipeMain",100);
     
    	// On cré notre HANDLE file .
    	HANDLE hFile = CreateFile("\\\\.\\pipe\\PipeMain", GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
     
    	// On remplie notre buffer avec les données à envoyer
    	strcpy(szPipeUpdate,Message.c_str());
     
    	// Si le HANDLE n'a pas été créer .
    	if(hFile == INVALID_HANDLE_VALUE)
    	{ 
    		std::cerr << "Erreur dans le CreateFile du pipe, niveau client" << std::endl ;
        }
        else
        {
    		// On tente d'envoyez des donnée dans le tube
    		BOOL flg = WriteFile(hFile, szPipeUpdate, strlen(szPipeUpdate), &dwWrite, NULL);
     
    		// Si ca n'a pas réussi, on envoie un message d'erreur .
    		if (FALSE == flg)
            {
    			std::cerr << "Erreur dans l'envoie de données" << std::endl ;
            }
     
    		// On ferme notre HANDLE 
            CloseHandle(hFile);
    	}
     
    	// Le nom du pipe .
    	std::string PipeName = "\\\\.\\pipe\\Pipe" ;
    	PipeName += LoginName;
    	size_t Size = PipeName.size() + 1;
    	char * Buffer = new char[Size];
    	// Copie la chaîne ( passage de const char* en char * ... )
    	strncpy( Buffer, PipeName.c_str(), Size ); 
     
    	HANDLE hPipe; 
    	hPipe = CreateNamedPipe (PipeName.c_str(), PIPE_ACCESS_DUPLEX, // read/write access 
                                                PIPE_TYPE_MESSAGE | // message type pipe 
                                                PIPE_READMODE_MESSAGE | // message-read mode 
                                                PIPE_WAIT, // blocking mode 
                                                PIPE_UNLIMITED_INSTANCES, // max. instances 
                                                4096, // output buffer size 
                                                4096, // input buffer size 
                                                5000, // client time-out 
                                                NULL); // no security attribute 
    	// On attend que quelqu'un se connecte 
    	for(;;)
    	{
    		// Le buffer qui va recevoir les données
    		CHAR Data[4096]; 
     
    		// Le nombre de bytes lu
    		DWORD BytesRead = 0 ;
     
    		// On attend qu'un utilisateur fasse une requête
    		BOOL fConnected = ConnectNamedPipe(hPipe,NULL);
     
    		// Si il y a des donnée a lire, on les récupère puis les traite .
    		if ( fConnected )
    		{
    			BOOL fSuccess = ReadFile (hPipe ,       // handle to pipe 
    									                Data ,       // buffer to receive data 
    													4096 ,       // size of buffer 
    													&BytesRead,  // number of bytes read 
    													NULL);       // not overlapped I/O 
     
    			Data[BytesRead] = '\0';
    			FlushFileBuffers(hPipe); 
    			std::cout << " mail recu !!!" << std::endl ;
    			DisconnectNamedPipe(HandleList["Main"]); 
    		}
    	}
    }
    Le hic ? ca bloque, le booléen qui indique si l'écriture c'est bien passé ou pas, lors de la réponse du serveur, est toujours a false ... Donc évidement, aprés, le client attend une réponse qui n'arrive pas, et idle .

  2. #2
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    Nouveau problème ( mais ya de l'espoir ... j'ai avancé par rapport a la dernière fois )

    EDIT :
    Je sais pas trop si c'est un progrés, masi on dirai que j'ai réussi a envoyé des donnée du server vers le pipe , par contre, je n'arive pas a les récupérer du coté clients :/

    voici la version changé de l'envoie de donné du serveur
    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
     
    	// Si on a une demande de consultation de mail, on envoie a l'utilisateur ses nouveaux message .
    	if ( Keyword == "GetMail" )
    	{
    		 std::cout << "Requete de mail de : " << Arg << std::endl ; 
     
    		// Des paramètre de notre pipe .
    		DWORD dwWrite2;
    		char szPipeUpdate2[4096];
     
    		// Notre message a envoyé
    		std::string Message2 = "tes mail" ;
     
    		// On remplie notre buffer avec les données à envoyer
    		strcpy(szPipeUpdate2,Message2.c_str());
     
    		 BOOL fSuccess2 = WriteFile(
             HandleList["Titi"],        // handle to pipe
             szPipeUpdate2,      // buffer to write from
             strlen(szPipeUpdate2), // number of bytes to write
             &dwWrite2,   // number of bytes written
             NULL);        // not overlapped I/O
     
    		 if ( fSuccess2 && dwWrite2 > 0 ) std::cout << "Mail envoyés" << std::endl ;
    	}

Discussions similaires

  1. Probleme de synchronisation
    Par AurelieB dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 20/11/2006, 10h53
  2. Réponses: 18
    Dernier message: 10/11/2006, 13h33
  3. [Debutant]Probleme de synchronisation
    Par Treuze dans le forum C
    Réponses: 3
    Dernier message: 17/05/2006, 11h21
  4. [Thread] Problème de synchronisation
    Par Pe04 dans le forum Concurrence et multi-thread
    Réponses: 12
    Dernier message: 13/12/2005, 11h44
  5. [Débutant][Threads] Problème de synchronisation
    Par sephile dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 02/01/2005, 23h29

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