| 12
 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
 
 | 	HANDLE hPipeB, hPipeA;
 
	//Création de la Boîte aux Lettres pour communiquer avec le programme B
	MakeSlot("\\\\.\\mailslot\\coordinate_engine");
	if (hSlot == INVALID_HANDLE_VALUE)
	{	cout<<"Echec ouverture pipe B \n"<<endl;
		return 0;
	}
	else
	{ 	//La boîte est créée ; on attend l'arrivée d'un message
		cout<<"Mail Server cree \n"<<endl;
		// création d ela pipe pour le programme B
		hPipeB = CreateNamedPipe( "\\\\.\\pipe\\coordinate_engine", // pipe name 
							PIPE_ACCESS_DUPLEX, // read/write access 
							PIPE_TYPE_MESSAGE , 
							1,
							1024, // output buffer size 
							1024, // input buffer size 
							2000, // client time-out 
							NULL);
 
		// création de la pipe pour le programme B
		hPipeA = CreateFileA( "\\\\.\\pipe\\coordinate_engine_input", // pipe name 
							GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 
		// Mise en pause pour me laisser le temps d'ouvrir le programme B....
		Sleep(4000);	
		if (hPipeA == INVALID_HANDLE_VALUE)
		{	cout<<"Echec ouverture pipe B \n"<<endl;	}
		else
		{	cout<<"Pipe A OK \n"<<endl;	
 
			DWORD cbRead;							// Va stocker le nombre de bits recus
			bool fSuccessA=false, fSuccessB=false;	// Lorsque fSuccessA = true, on a reçu correctement un message sur la pipe A; idem pour fSuccess B
			TCHAR messageB [MAX_PATH];				// Tableaux de TCHAR qui vont nous permettre de stocker les messages reçus respectivement par A et B
			TCHAR messageA [MAX_PATH];
 
			//** On passe les pipes en mode non-bloquant: on ne sera pas obligés d'attendre si une pipe ne reçoit pas de message
			DWORD dw = PIPE_NOWAIT;	
			SetNamedPipeHandleState(hPipeA, &dw, NULL, NULL);
			SetNamedPipeHandleState(hPipeB, &dw, NULL, NULL);
 
			//**Les deux pipes sont connectées, passées en mode non bloquant: on peut commencer. 
			while (1)	
			{	// Tant qu'on a pas reçu de message sur A OU sur B, on boucle. 
				//Je fais ainsi car A et B peuvent envoyer des messages n'importe quand, cela ne semble pas fonctionner au "chacun son tour"
				do {		// On essaie d elire un message sur B...
							fSuccessB = ReadFile(hPipeB, // pipe handle
										messageB ,// buffer to receive reply
										sizeof(messageB), // size of buffer
										&cbRead, // number of bytes read
										NULL); // not overlapped
 
							// On essaie de lire un message sur A...
							fSuccessA = ReadFile(hPipeA, // pipe handle
								messageA ,// buffer to receive reply
								sizeof(messageA), // size of buffer
								&cbRead, // number of bytes read
								NULL); // not overlapped
			}while (!fSuccessA && !fSuccessB); 
 
			//** Cas où A a reçu un message
			if (fSuccessA)
			{	// On essaie de l'afficher... Avec t_printf qui est censé afficher correctement un TCHAR si je ne m'abuse
				cout<<"Contenu du message A:"<<endl;	
				_tprintf("%s\n ",TEXT(messageA));
 
				// On l'écrit tel quel dans la pipe B
				WriteFile(  hPipeB,  messageA,sizeof(messageA),&cbRead, NULL); 
			}
 
			//** Cas où B a reçu un message: exactement la même que pour A
			if (fSuccessB)
			{	cout<<"Contenu du message B:"<<endl;	
				_tprintf("%s\n ",TEXT(messageB));
 
				// On l'écrit tel quel dans la pipe A
				WriteFile(  hPipeA,  messageB, 	sizeof(messageB),&cbRead, NULL); 
			}
		}
	} | 
Partager