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

Visual C++ Discussion :

[VC++] probleme avec le Pipe Named


Sujet :

Visual C++

  1. #1
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 245
    Points : 81
    Points
    81
    Par défaut [VC++] probleme avec le Pipe Named
    En fait, je suis entrainde developper une application qui peut se comporter comme server et une appli de test qui se comporte comme client. pour l'architecture client/server, j'ai utilisé les PipeNamed et pour cela j'ai implementé mon server comme suit :



    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    typedef struct 
    { 
       OVERLAPPED oOverlap; 
       HANDLE hPipeInst; 
       TCHAR chRequest[BUFSIZE]; 
       DWORD cbRead;
       TCHAR chReply[BUFSIZE]; 
       DWORD cbToWrite; 
    } PIPEINST, *LPPIPEINST; 
     
    HANDLE hPipe; 
     
    BOOL fSuccess, fPendingIO;
    LPPIPEINST lpPipeInst; 
    DWORD dwWait, cbRet; 
    OVERLAPPED oConnect; 
     
    extern "C" EXPORT void cpaServerCommStart(cpaServerCommLibHandleT cpaServerCommLibHandle)   
    {
      //  struct timeval timeout;
    	cpaMessageHeaderT * mess=NULL;
     
    	//	bool HandleExist;
     
    	oConnect.hEvent = CreateEvent( NULL,  TRUE, TRUE, NULL);   
    	if (oConnect.hEvent == NULL) 
    	   {
    		  printf("CreateEvent failed with %d.\n", GetLastError()); 
    		  char KTxtCountServer[] = "CPAServer";
    		  printf ("CPAServer");
    	      exit(-1);
    	   }
     
       fPendingIO = CreateAndConnectInstance(&oConnect); 
    	printf ("Server Connected.\n");
    	while (1) 
    		{ 
       //timeout.tv_sec = 60;
       //timeout.tv_usec = 0;
     
          dwWait = WaitForSingleObjectEx( oConnect.hEvent,  INFINITE, TRUE);  
     
          switch (dwWait) 
          { 
     
          // The wait conditions are satisfied by a completed connect 
          // operation. 
             case 0: 
             // If an operation is pending, get the result of the 
             // connect operation. 
     
    		if (fPendingIO) 
             { 
                fSuccess = GetOverlappedResult(hPipe, &oConnect, &cbRet, FALSE);  
                if (!fSuccess) 
                {
                   printf("ConnectNamedPipe (%d)\n", GetLastError());
    			   exit(-1);
    //               return 0;
                }
             } 
             // Allocate storage for this instance. 
                lpPipeInst = (LPPIPEINST) GlobalAlloc(GPTR, sizeof(PIPEINST)); 
                if (lpPipeInst == NULL) 
                {
                   printf("GlobalAlloc failed (%d)\n", GetLastError()); 
    			   exit(-1);
               //    return 0;
                }
                 lpPipeInst->hPipeInst = hPipe; 
                 lpPipeInst->cbToWrite = 0; 
     
    		mess = cpaCommReadMessage(lpPipeInst->hPipeInst);
    		if (mess!=NULL){
    		printf("\nserver - Pipe Handle : %p \n", lpPipeInst->hPipeInst);
    		if(lib_handle.cpaClientConnectCB)
    				lib_handle.cpaClientConnectCB((cpaServerConnHandleT)lpPipeInst->hPipeInst);
     
    		if(lib_handle.cpaServerHandleMsgCB)
    				lib_handle.cpaServerHandleMsgCB((cpaServerConnHandleT)lpPipeInst->hPipeInst,mess);
    		}
             // Create new pipe instance for the next client. 
                fPendingIO = CreateAndConnectInstance( &oConnect); 
                break; 
     
          // The wait is satisfied by a completed read or write 
          // operation. This allows the system to execute the 
          // completion routine. 
     
             case WAIT_IO_COMPLETION:    break; 
     
          // An error occurred in the wait function. 
     
             default: 
             {
                printf("WaitForSingleObjectEx (%d)\n", GetLastError()); 
    //            return 0;
             }
          } 
       } 
    }


    et mon client comme suit :



    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
    extern "C" 
    EXPORT cpaClientConnHandleT cpaClientCommOpenConnection(void)
    {	
     
    // Try to open a named pipe; wait for it, if necessary. 
     
       while (1) 
       { 
          hPipe = CreateFile(lpszPipename, GENERIC_READ | GENERIC_WRITE, 0, NULL, 
    					OPEN_EXISTING, 0, NULL);        
     
       // Break if the pipe handle is valid. 
     
          if (hPipe != INVALID_HANDLE_VALUE) 
             break; 
     
          // Exit if an error other than ERROR_PIPE_BUSY occurs. 
     
          if (GetLastError() != ERROR_PIPE_BUSY) 
          {
             printf("Could not open busy pipe\n"); 
             return NULL;
     
          }
     
          // All pipe instances are busy, so wait for 20 seconds. 
     
          if (!WaitNamedPipe(lpszPipename, 20000)) 
          { 
             printf("Could not open pipe\n"); 
             return NULL;
     
          } 
       } 
     
    // The pipe connected; change to message-read mode. 
     
       dwMode = PIPE_READMODE_MESSAGE; 
       fSuccess = SetNamedPipeHandleState( hPipe, &dwMode,  NULL, NULL);   
       if (!fSuccess) 
       {
          printf("SetNamedPipeHandleState failed\n"); 
          return NULL;
       }
     
       printf ("Connexion Established\n");
       printf("Client - Pipe Handle : %p\n",hPipe);
     
      	return hPipe;
     
    }

    de toute façon je me suis inspiré des exemple que j'ai trouve sur les msdn.

    mais le probleme c'est que on peut fairequ'une fois la communication entre le client et le server.

    je m'explique :

    1 - le server se met en attente, puis le client se connecte.
    2 - a la connexion le client envoie un message au server.
    3 - le server recoit le message et envoie un message de confirmation de sa part au client.
    4 - apres le client essaye d'envoyer un autre message sur le meme pipe. mais ca ne marche pas.

    je ne sais pas est ce que le message ne s'envoie pas ou c'est le serveur qui le recoit pas.

    est ce qu'il y a quelqu'un qui peut m'aider pour regler ca.

    je veux configurer mon pipe pour pouvoir envoyer et recevoir plusieurs message de chaque coté.

    comment pourrai-je faire ca ?

  2. #2
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Fais voir la création de ton pipe, il suffit d'un flag qui manque...

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    j'avais donné un exemple client/serveur a base pipe nommé .
    http://www.developpez.net/forums/sho...449#post331449

Discussions similaires

  1. Probleme avec un code .name
    Par kyros21 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 13/01/2012, 11h21
  2. probleme avec VisualState x:Name="focused"
    Par lilibad dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 05/09/2011, 16h46
  3. problem avec django_qbe "error Empty modul name"
    Par midialzer dans le forum Django
    Réponses: 0
    Dernier message: 12/01/2011, 14h49
  4. probleme avec ecriture de pipe nommé
    Par Rhapso59 dans le forum C
    Réponses: 0
    Dernier message: 24/04/2009, 16h24
  5. Probleme de perf avec File::Find::name;
    Par Ludo167 dans le forum Modules
    Réponses: 6
    Dernier message: 14/07/2004, 11h31

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