Se connecter / S'enregistrer
Votre question

ouvrir un pipe en C

Tags :
  • table
  • Programmation
Dernière réponse : dans Programmation
26 Avril 2008 19:50:12

bonjour,

Je cherche comment faire pour ouvrir un pipe en C, je l'ai créé mais impossible de l'ouvrir

voila ce que j'ai tapé en cours avec l'aide du prof


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h> /*fonction maths classique*/
#include <float.h>
#include "AppliDataType.h"
#include "PipeFun.h"
#include "ProcFun.h"
#include "ShareFun.h"

int main (void)
{
/*variable*/
LPSharedTable table;
PipeParam *p2calculus;
DWORD InBytes; /*nb octets lu*/
int i; /*compteur de boucle*/
double moyenne;
double ecarttype;

/*ouverture du pipe*/
p2calculus = (LPPipeParam)calloc(1,sizeof(PipeParam));
p2calculus->InBuffer = (unsigned char * )calloc(128,sizeof(unsigned char*));
p2calculus->OutBuffer = (unsigned char * )calloc(128,sizeof(unsigned char*));

p2calculus->handle = CreateFile("P2CALCULUS",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_ARCHIVE,
NULL );

if ( p2calculus->handle == INVALID_HANDLE_VALUE)
{
fprintf(stderr,"Impossible d'ouvrir le pipe...\n");
free(p2calculus->InBuffer);
free(p2calculus->OutBuffer);
free(p2calculus);
exit(0);
};



/*acces a la zone de partage*/

if( !CreateOrLinkSharedTable("TABLE PARTAGEE",
&table ))
{
fprintf(stderr,"Impossible d'accéder a la table...\n");
exit(0);
};

/*dans cette boucle on attend les donnees en provenance*/
/*du pipe*/

do
{
if(ReadFile( p2calculus->handle, /*lire le pipe*/
p2calculus->InBuffer, /*zone de stockage des donnes lues*/
1, /*nb d'octet lu*/
&InBytes,
NULL ))
{
fprintf(stderr,"erreur de lecture dans le pipe...\n");
exit(0);
};
/*en fonction de ce qui est lu on affiche ou on quitte*/
switch(p2calculus->InBuffer[0])
{
/*demande de calcul */
case 0x88:
moyenne=0.0;

for(i=0; i < *(table->NbValues);i++)
{
moyenne+=table->Values;

};
moyenne=moyenne/ *(table->NbValues);
printf("moyenne = %lf\n",moyenne);
ecarttype=0.0;
for(i=0; i < *(table->NbValues);i++)
{
ecarttype+=moyenne-table->Values*(moyenne-table->Values);
};
ecarttype=ecarttype/ *(table->Values);
ecarttype=sqrt(ecarttype);
printf("ecarttype = %lf\n",ecarttype);
printf("\a");
break;

/*demande de sortie*/
case 0xff:
break;
default:
break;
};
if(p2calculus->InBuffer[0]==0xff) break;
}
while(1);
/*fermeture du pipe et menage qui va avec*/
CloseHandle( p2calculus->handle );
free (p2calculus->InBuffer);
free (p2calculus->OutBuffer);
free (p2calculus);
DestroyOrUnlinkSharedTable( &table );

return (0);
}

Autres pages sur : ouvrir pipe

a b L Programmation
26 Avril 2008 21:11:37

Bon pour windows (Win32 API), je vais pas trop t'aider, parce que généralement on utilise plutôt les messages, alors je n'ai pas l'habitude. :) 

Dans ton cas, je ne vois pas de CreatePipe(), donc tu ne fais pas des pipes. En fait, là tu pars sur un fichier mappé en mémoire, non ?
26 Avril 2008 22:51:15

en fait le pipe a été créé dans un autre programme, le prof nous a expliqué que dans celui-ci il fallait l'ouvrir, au départ on avait retapé createfile pourl'ouvrir, mais cela ne marchait pas alors il nous a dit de tapé (après recherche) les lignes avec generic_read.... mais pas mieux

merci d'avance
a b L Programmation
27 Avril 2008 10:40:16

Apparemment, tu utilises de la mémoire partagée avec ton CreateOrLinkSharedTable : je n'en vois pas l'intérêt, mais passons :) 

Bon, alors je vois que tu fais un pipe nommé P2CALCULUS, et que tu es dans le client.
Commence par enlever les options share, car tu ne fais pas de la partage mémoire mais un pipe (ça marche peut-être avec, mais comme ça ne sert à rien, autant l'enlever).

Je viens de jeter un coup d'oeil sur la doc.
http://msdn2.microsoft.com/en-us/library/aa365789(VS.85).aspx

Quand tu passes dans ton CreateFile, qui te dis que le pipe a déjà été créé côté serveur ? rien, et il se peut qu'il ne soit pas encore créé, alors il faut faire une boucle avec une attente en utilisant WaitNamedPipe.
Bon, tu as peut-être lancé le serveur bien avant, mais on ne sait jamais :) 

Ensuite, il faut visiblement indiquer le mode d'utilisation du pipe avec SetNamedPipeHandleState, que tu n'as visiblement pas utilisé.

Enfin, es-tu sûr que le problème vient du client et pas du serveur ?
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS