156 lines
3.5 KiB
C
156 lines
3.5 KiB
C
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <msg.h>
|
|
|
|
/*------------------------------------------------------------------------------------------*/
|
|
/* Fonction principale du programme */
|
|
/*------------------------------------------------------------------------------------------*/
|
|
void main ( void )
|
|
{
|
|
MSGT_Port * My_Port;
|
|
MSGT_Message * Msg;
|
|
int End_Process;
|
|
|
|
|
|
/* Ouverture de la librairie LIBMSG */
|
|
|
|
if (MSG_Library_Open (NULL, NULL, MSGD_OPEN) != MSGS_OK)
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
/* Ouverture / création du port de messages privé */
|
|
|
|
if (MSG_Port_Open (<PORT_NAME>, &My_Port, <OPEN_MODE>) != MSGS_OK)
|
|
/*
|
|
<PORT_NAME> = nom du port privé (sans espace)
|
|
<OPEN_MODE> = MSGD_OPEN ou MSGD_CREATE
|
|
*/
|
|
{
|
|
MSG_Library_Close (MSGD_CLOSE);
|
|
return;
|
|
}
|
|
|
|
|
|
/* Boucle principale du programme */
|
|
|
|
End_Process = FALSE;
|
|
|
|
while (End_Proces == FALSE)
|
|
{
|
|
/* Ecoute du port de messages privé */
|
|
|
|
int rc = MSG_Message_Receive (My_Port, <RECEIVE_TYPE>, &Msg, <RECEIVE_MODE>);
|
|
/*
|
|
<RECEIVE_MODE> = MSGD_WAIT ou MSGD_NO_WAIT
|
|
<RECEIVE_TYPE> = MSGD_NO_TYPE ou type prédéfini ou type utilisateur
|
|
*/
|
|
|
|
switch (rc)
|
|
{
|
|
case MSGS_OK:
|
|
|
|
/* Message reçu */
|
|
|
|
Message_Process (Msg);
|
|
|
|
break;
|
|
|
|
case MSGS_NO_MSG:
|
|
|
|
/* Aucun message présent (en mode MSGD_NO_WAIT seulement) */
|
|
|
|
...
|
|
|
|
break;
|
|
|
|
case MSGS_BAD_TYPE:
|
|
|
|
/* Aucun message du type demandé (en mode MSGD_NO_WAIT seulement) */
|
|
|
|
...
|
|
|
|
break;
|
|
|
|
case MSGS_SIGNAL:
|
|
|
|
/* Ecoute interrompue par l'interception d'un signal */
|
|
|
|
...
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
}
|
|
|
|
/* Traitement propre au programme */
|
|
|
|
...
|
|
|
|
} /* Fin de la boucle principale */
|
|
|
|
|
|
/* Fermeture du port de messages privé */
|
|
|
|
if (MSG_Port_Close (My_Port, <CLOSE_MODE>) != MSGS_OK) /* <CLOSE_MODE> = MSGD_CLOSE ou MSGD_DESTROY */
|
|
{
|
|
MSG_Library_Close (MSGD_CLOSE);
|
|
return;
|
|
}
|
|
|
|
|
|
/* Fermeture de la librairie LIBMSG */
|
|
|
|
MSG_Library_Close (MSGD_CLOSE);
|
|
}
|
|
|
|
|
|
/*------------------------------------------------------------------------------------------*/
|
|
/* Fonction de traitement d'un message reçu sur le port privé */
|
|
/*------------------------------------------------------------------------------------------*/
|
|
|
|
void Message_Process ( MSGT_Message * Msg )
|
|
{
|
|
/* Quel est le type du message ? */
|
|
|
|
switch ( (int)(Msg->Type) )
|
|
{
|
|
case <TYPE1>:
|
|
|
|
...
|
|
|
|
case <TYPE2>:
|
|
|
|
/* Traitement selon le message */
|
|
|
|
...
|
|
|
|
/* Réponse au message */
|
|
|
|
if (Msg->Size > strlen ("Message bien reçu"))
|
|
{
|
|
/* Réponse au message reçu */
|
|
|
|
strcpy ((char *)(Msg->Data), "Message bien reçu");
|
|
|
|
/* Retour à l'envoyeur */
|
|
|
|
if (MSG_Message_Reply (Msg) == MSGS_OK) return;
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
}
|
|
|
|
/* Si on n'a pas répondu au message, on le supprime */
|
|
|
|
MSG_Message_Free (Msg);
|
|
}
|