
Utilisation de tubes nommés
10 messages
• Page 1 sur 1
Utilisation de tubes nommés
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 !
Je n'ai trouvé aucun programme simple sur Internet :/
Si quelqu'un peut m'aider, merci !
- Paul
Re: Utilisation de tubes nommés
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 :
et pour le lecteur :
Si ça ne marche pas (car j'ai pas testé...), n'hésite pas à poser tes questions !
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
Bonjour,
j'ai quelques erreurs :/
Il serait pas mieux d'utiliser CreateNamedPipe ?
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
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
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
Bonjour, c'est encore moi,
J'ai toujours un soucis au niveau de cette ligne :
L'erreur est la suivante : Run-Time Check Failure #3
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
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 !
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
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é :
Pour le client :
Les paramètres sont assez explicite...
Ensuite, pour plus de simplicité, on peut passer le client en mode message (et non pas octet à octet) :
Enfin, que ce soit pour le serveur ou le client, les messages s'échangent comme ça :
En espérant que ça te sera utile !
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...
- 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
10 messages
• Page 1 sur 1
Retourner vers Questions générales
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité