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[i];
};
moyenne=moyenne/ *(table->NbValues);
printf("moyenne = %lf\n",moyenne);
ecarttype=0.0;
for(i=0; i < *(table->NbValues);i++)
{
ecarttype+=moyenne-table->Values[i]*(moyenne-table->Values[i]);
};
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);
}
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 ?
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
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/l [...] S.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 ?
Il y a 1789 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
Par allstar27 il y a 4 jours :
Bonjour, Il suffit d'insérer une table point dans ta base de données, lorsque l'utilisateur par le biais d'une $_SESSION['id'] aucmente ses points, tu update cette table. Ensuite pour débloquer se que tu souhaites, tu fais une petite condition: Code :<?phpif ($_SESSION['point'] < 5) {echo "pas assez de points";} else {echo "assez de points";}?>
SiM07 - Expert argent
Spécialité(s) : Programmation, OS, Logiciels
12151 messages depuis le 20/02/2005
