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
    Membre �clair�
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2006
    Messages
    245
    D�tails du profil
    Informations personnelles :
    �ge : 44
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 245
    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 chevronn�
    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
    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
    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