logo

Utilisation de tubes nommés

Vous pouvez poster vos questions qui ne rentrent pas dans les autres catégories...

Utilisation de tubes nommés

Messagede Paul » 13 Avr 2010, 09:58

Bonjour, je cherche un petit exemple de création de tube sous Windows avec un lecteur et un écrivain. Si quelqu'un a ça quelque part ce serait sympa

Je n'ai trouvé aucun programme simple sur Internet :/

Si quelqu'un peut m'aider, merci !
Paul
 

Re: Utilisation de tubes nommés

Messagede Tibo » 13 Avr 2010, 18:33

Salut,
les tubes nommés sous windows sont utilisés comme des fichiers...
Pour créer un tube nommé dans les deux processus, il faut donc faire un truc genre pour l'écrivain :
Code: Tout sélectionner
   HANDLE hFile = CreateFile("\\\\.\\pipe\\monTube",GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL);
   if (hFile == INVALID_HANDLE_VALUE)
      {
         printf("Erreur lors de la création du tube.");
         return;
      }
   DWORD dwBytesWritten, dwPos;
   BYTE   buff[4096];

   while (trucs à écrire)
     {
      buff[0]=22;//remplit le buffer avec les valeurs à écrire
      dwPos = SetFilePointer(hFile, 0, NULL, FILE_END);//va à la fin du fichier
      LockFile(hFile, dwPos, 0, sizeof(buff), 0);//empêche les conflits
      WriteFile(hFile, buff, sizeof(buff), &dwBytesWritten, NULL);
      UnlockFile(hFile, dwPos, 0, sizeof(buff), 0);
     }
   CloseHandle(hFile);

et pour le lecteur :

Code: Tout sélectionner
   HANDLE hFile = CreateFile("\\\\.\\pipe\\monTube",GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL);
   if (hFile == INVALID_HANDLE_VALUE)
      {
         printf("Erreur lors de la création du tube.");
         return;
      }
   DWORD dwBytesRead, dwPos;
   BYTE   buff[4096];

   while (ReadFile(hFile, buff, sizeof(buff), &dwBytesRead, NULL)
         && dwBytesRead > 0))
     {
      //faire des trucs avec buff...
     }
   CloseHandle(hFile);


Si ça ne marche pas (car j'ai pas testé...), n'hésite pas à poser tes questions !
Tibo
Administrateur du site
 
Messages: 147
Inscription: 26 Mar 2008, 13:58

Re: Utilisation de tubes nommés

Messagede Paul » 14 Avr 2010, 12:42

Merci bien ! je vais essayer ton code :)
Paul
 

Re: Utilisation de tubes nommés

Messagede Paul » 15 Avr 2010, 10:20

Bonjour,

j'ai quelques erreurs :/

Code: Tout sélectionner
lecture.cpp(12) : error C2660: 'CreateFileA' : la fonction ne prend pas 6 arguments


Il serait pas mieux d'utiliser CreateNamedPipe ?
Paul
 

Re: Utilisation de tubes nommés

Messagede Tibo » 15 Avr 2010, 20:31

Salut,
je croyait que le dernier argument était optionnel, mais met NULL à la place.
Si tu as d'autres erreur, j'essayerais de regarder moi même.

Pour ce qui est de CreateNamedPipe, ça m'a l'air d'être simplement un CreateFile encapsulé avec les bonnes options...

Bon courage pour la suite
Tibo
Administrateur du site
 
Messages: 147
Inscription: 26 Mar 2008, 13:58

Re: Utilisation de tubes nommés

Messagede Paul » 24 Avr 2010, 14:12

Bonjour, c'est encore moi,

J'ai toujours un soucis au niveau de cette ligne :

Code: Tout sélectionner
dwPos = SetFilePointer(hFile, 0, NULL, FILE_END);


L'erreur est la suivante : Run-Time Check Failure #3
Paul
 

Re: Utilisation de tubes nommés

Messagede Tibo » 27 Avr 2010, 21:52

Salut,
désolé de te répondre si tard, mais je suis pas mal pris en ce moment...

Pour ton soucis, il va falloir que je mette la main à la pâte et coder par moi même un petit test... Je te tiens au courant dans la semaine !
Tibo
Administrateur du site
 
Messages: 147
Inscription: 26 Mar 2008, 13:58

Re: Utilisation de tubes nommés

Messagede Paul » 28 Avr 2010, 00:48

J'ai le temps, pas de soucis ! C'est déjà sympa de m'aider :)
Paul
 

Re: Utilisation de tubes nommés

Messagede Tibo » 30 Avr 2010, 10:37

Salut,
donc après quelques tests, j'ai enfin réussi à faire marcher ces pipes sous windows (et c'est pas tout à fait comme je te disais...)
Donc voila mes conclusions :

Pour le serveur :
Création d'un tube nommé :
Code: Tout sélectionner
hPipe = CreateNamedPipe("\\\\.\\pipe\\monTube",
         PIPE_ACCESS_DUPLEX,
         PIPE_TYPE_MESSAGE |
         PIPE_READMODE_MESSAGE |
         PIPE_WAIT,
         PIPE_UNLIMITED_INSTANCES,
         BUFSIZE,
         BUFSIZE,
         0,
         NULL);

  • Le premier paramètre correspond au nom (si utilisation de unicode, mettre un L devant : L"\\\\.\\pipe\\monTube", verifier dans les propriétés du compilateur)
  • Le second : pour donner l'accès au tube dans les deux sens (lecture/écriture)
  • Le troisième c'est une combinaison : message type pipe, lecture par message et non pas octet par octet et mode bloquant.
  • Le 4ème, c'est pour autoriser le maximum de connexion simultanées
  • le 5ème et 6ème sont pour la taille du buffer
  • les deux derniers pour un timeout du client et les attributs de sécuités...
Une fois créé, il ne reste plus qu'a attendre un client (ou pas, mais sinon tout ce qu'on enverra dans le pipe sera perdu) :
Code: Tout sélectionner
bool fConnected = ConnectNamedPipe(hPipe, NULL);



Pour le client :
Code: Tout sélectionner
hPipe = CreateFile(   "\\\\.\\pipe\\monTube",
         GENERIC_READ |
         GENERIC_WRITE,
         0,
         NULL,
         OPEN_EXISTING,
         0,
         NULL);

Les paramètres sont assez explicite...
Ensuite, pour plus de simplicité, on peut passer le client en mode message (et non pas octet à octet) :
Code: Tout sélectionner
DWORD dwMode = PIPE_READMODE_MESSAGE;
SetNamedPipeHandleState(hPipe,   // pipe handle
      &dwMode,    // nouveau mode
      NULL,
      NULL);


Enfin, que ce soit pour le serveur ou le client, les messages s'échangent comme ça :

Code: Tout sélectionner
WriteFile( hPipe,   // handle du pipe
   rep.c_str(),   // tableau de char
   rep.length(),   // nb octect à écrire
   &nbOctet,      // permet de vérifier le nb d'octet envoyés
   NULL);      // not overlapped I/O


Code: Tout sélectionner
ReadFile(hPipe,   // handle du pipe
   reponse,      // char* (tableau)
   BUFSIZE,      // taille du tableau
   &nbOctet,      // permet de savoir le nb d'octet lu
   NULL);      // not overlapped I/O


En espérant que ça te sera utile !
Tibo
Administrateur du site
 
Messages: 147
Inscription: 26 Mar 2008, 13:58

Re: Utilisation de tubes nommés

Messagede Paul » 04 Mai 2010, 10:06

Ça marche ! Merci bien :D
Paul
 


Retourner vers Questions générales

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron
Hit-Parade des sites francophones