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

Windows Discussion :

Problème de synchronisation de connexion à un pipe entre le client et le serveur


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Par défaut Problème de synchronisation de connexion à un pipe entre le client et le serveur
    Bonjour tout le monde,
    J'ai deux processus qui tournent chacun sur une session différente, mais sur le même pc. Ces deux process communiquent en moyennnant un pipe nommé.

    Processus Serveur P1:
    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
    #include "stdafx.h"
    #include "windows.h"
    
    #define g_szPipeName "\\\\.\\Pipe\\MyNamedPipe"  //Name given to the pipe
    //Pipe name format - \\.\pipe\pipename
    
    #define BUFFER_SIZE 1024 //1k
    #define ACK_MESG_RECV "Message received successfully"
    
    int main(int argc, char* argv[])
    {
    
         HANDLE hPipe;
    	 
         
         hPipe = CreateNamedPipe( 
              g_szPipeName,             // pipe name 
              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  
              BUFFER_SIZE,              // output buffer size 
              BUFFER_SIZE,              // input buffer size 
              NMPWAIT_USE_DEFAULT_WAIT, // client time-out 
              NULL);                    // default security attribute 
         
         if (INVALID_HANDLE_VALUE == hPipe) 
         {
              printf("\nError occurred while creating the pipe: %d", GetLastError()); 
              return 1;  //Error
         }
         else
         {
              printf("\nCreateNamedPipe() was successful.");
         }
         
         printf("\nWaiting for client connection...");
         
         //Wait for the client to connect
         BOOL bClientConnected = ConnectNamedPipe(hPipe, NULL);
         
         if (FALSE == bClientConnected)
         {
              printf("\nError occurred while connecting to the client: %d", GetLastError()); 
              CloseHandle(hPipe);
              return 1;  //Error
         }
         else
         {
              printf("\nConnectNamedPipe() was successful.");
         }
         
         char szBuffer[BUFFER_SIZE];
         DWORD cbBytes;
         
         //We are connected to the client.
         //To communicate with the client we will use ReadFile()/WriteFile() 
         //on the pipe handle - hPipe
         
         ....
    }
    Processus Client P2:
    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
    #include "stdafx.h"
    #include "windows.h"
    
    #define g_szPipeName "\\\\.\\Pipe\\MyNamedPipe"  //Name given to the pipe
    //Pipe name format - \\servername\pipe\pipename
    //This pipe is for server on the same computer, however, pipes can be used to
    //connect to a remote server
    
    #define BUFFER_SIZE 1024 //1k
    #define ACK_MESG_RECV "Message received successfully"
    
    int main(int argc, char* argv[])
    {
         HANDLE hPipe;
         
         //Connect to the server pipe using CreateFile()
         hPipe = CreateFile( 
              g_szPipeName,   // pipe name 
              GENERIC_READ |  // read and write access 
              GENERIC_WRITE, 
              0,              // no sharing 
              NULL,           // default security attributes
              OPEN_EXISTING,  // opens existing pipe 
              0,              // default attributes 
              NULL);          // no template file 
         
         if (INVALID_HANDLE_VALUE == hPipe) 
         {
              printf("\nError occurred while connecting to the server: %d", GetLastError()); 
              //One might want to check whether the server pipe is busy
              //This sample will error out if the server pipe is busy
              //Read on ERROR_PIPE_BUSY and WaitNamedPipe() for that
              return 1;  //Error
         }
         else
         {
              printf("\nCreateFile() was successful.");
         }
    Le problème c'est qu'en lançant les deux "en cascade" parfois le client arrive au CreateFile avant que le serveur arrive au ConnetcNamedPipe(), je reçois le message suivant:
    Error occurred while connecting to the client: 535
    Le problème est
    ERROR_PIPE_CONNECTED
    535 (0x217) There is a process on other end of the pipe.
    Les gens de msdn ont signalé un problème "pareil" mais pas le même que chez moi, mais je pense que les deux erreurs proviennent du même problème de synchro
    If a client connects before the function is called, the function returns zero and GetLastError returns ERROR_PIPE_CONNECTED. This can happen if a client connects in the interval between the call to CreateNamedPipe and the call to ConnectNamedPipe. In this situation, there is a good connection between client and server, even though the function returns zero.
    sur le lien suivant: http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
    mais je sais pas comment remédier à ça.

    Merci pour vos réponses

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 503
    Par défaut
    Synchroniser les processus, via un Event nommé, par exemple.
    http://msdn.microsoft.com/en-us/libr...96(VS.85).aspx

  3. #3
    Membre confirmé Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Synchroniser les processus, via un Event nommé, par exemple.
    http://msdn.microsoft.com/en-us/libr...96(VS.85).aspx
    l'instruction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     BOOL bClientConnected = ConnectNamedPipe(hPipe, NULL);
    est bloquante(met le processus dans un état d'attente infini de la connexion d'un client), on est bien daccord ?
    Alors si je vais mettre le SetEvent(); avant le ConnectNamedPipe(); je vais rien gagné dans ce cas(qui va me garantir que le processus P2 ne va pas se connecter -en appelant le CerateFile()-entre SetEvent(); et ConnectNamedPipe(); ?), et si je vais la mettre après, ça va servir à rien :/
    Je sais pas si vous êtes daccord avec moi en ça ou bien je me trompe ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 503
    Par défaut
    Bien vu.

    Mais dans VOTRE code, il y une référence à WaitNamedPipe.
    http://msdn.microsoft.com/en-us/libr...00(VS.85).aspx

    Ce n’est pas ce que vous cherchez.

  5. #5
    Membre confirmé Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Mais dans VOTRE code
    Ce n'est pas le mien bien entendu sinon ça serait fou de ma part hein

  6. #6
    Membre confirmé Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Par défaut
    Là en suivant l'exécution du code avec le debogueur, je remarque que le client passe le WaitNamedPipe dès que le pipe est crée avec CreateNamedPipe() et non pas dès connexion du serveur avec le ConnectNamedPipe()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WaitNamedPipe(g_szPipeName,NMPWAIT_WAIT_FOREVER);//Attendre que le pipe soit libre 
    	HANDLE hPipe;
         
         //Connect to the server pipe using CreateFile()
         hPipe = CreateFile( 
              g_szPipeName,   // pipe name 
              GENERIC_READ |  // read and write access 
              GENERIC_WRITE, 
              0,              // no sharing 
              NULL,           // default security attributes
              OPEN_EXISTING,  // opens existing pipe 
              0,              // default attributes 
              NULL);          // no template file
    C'est une histoire sans fin apparement >_<

    Mais les gens de MS disent que :
    Waits until either a time-out interval elapses or an instance of the specified named pipe is available for connection (that is, the pipe's server process has a pending ConnectNamedPipe operation on the pipe).
    C'est quoi cette histoire

  7. #7
    Membre confirmé Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Par défaut
    La fonction WaitForNamedPipe() ne permet elle pas de régler mon problème ? http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
    C++

    BOOL WINAPI WaitNamedPipe(
    __in LPCTSTR lpNamedPipeName,
    __in DWORD nTimeOut
    );
    surtout qu'on précise que son but c'est :
    Waits until either a time-out interval elapses or an instance of the specified named pipe is available for connection (that is, the pipe's server process has a pending ConnectNamedPipe operation on the pipe).
    et la remarque vers la fin dit que :
    If the function succeeds, the process should use the CreateFile function to open a handle to the named pipe. A return value of TRUE indicates that there is at least one instance of the pipe available.

  8. #8
    Membre confirmé Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Par défaut
    quelle synchro !! nous avons écrit ensemble apparement

Discussions similaires

  1. [Débutant] comment établir la connexion entre un client et un serveur?
    Par spring.time dans le forum VB.NET
    Réponses: 12
    Dernier message: 20/10/2012, 10h41
  2. Réponses: 3
    Dernier message: 17/06/2012, 16h36
  3. Connexion entre le client et le serveur
    Par lassault1 dans le forum Réseau
    Réponses: 0
    Dernier message: 27/04/2010, 17h25
  4. Réponses: 11
    Dernier message: 07/10/2006, 18h37
  5. [OUTIL]Outil de trace SQL entre 1 client et 1 serveur
    Par Laurent Dardenne dans le forum Oracle
    Réponses: 12
    Dernier message: 15/04/2005, 19h44

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