mb_receive
mb_receive
SYNOPSIS
int mb_receive( int socket, int *msg_id, int *msg_len, u_char **msg )
DESCRIPTION
mb_receive
lit un message en entrée.
socket est un identifiant retourné par un appel antérieur à mb_bind
.
msg_id est un numéro de requête qui peut servir à identifier la réponse de façon unique.
Le message est lu dans *msg qui pointe sur une zone en mémoire nouvellement allouée. La longueur du message est placée dans *msg_len qui doit pointer sur un entier.
mb_receive
retourne un type de message qui peut être MB_ONEWAY, MB_TWOWAY ou MB_MULTIWAY pour une notification ou une requête,
MB_REPLY pour une réponse, MB_NOBODY ou MB_TIMEOUT pour une réponse d'erreur,
MB_REGISTER ou MB_PROBE pour un message d'information en réponse à un appel à mb_register
ou mb_probe
.
MB_ONEWAY | '1' | Message sans réponse. |
MB_TWOWAY | '2' | Message avec réponse. |
MB_MULTIWAY | 'M' | Diffusion d'un message sans réponse. |
MB_REPLY | 'R' | Message en réponse à un message MB_TWOWAY précédent. |
MB_NOBODY | 'N' | Message d'erreur envoyé par le bus. |
MB_TIMEOUT | 'T' | Message d'erreur envoyé par le bus. |
MB_REGISTER | 'I' | Message d'information envoyé par le bus. |
MB_PROBE | 'P' | Message d'information envoyé par le bus. |
Quand un message MB_TWOWAY est reçu, un appel à mb_reply
doit suivre avant que le bus ne retourne un message
MB_TIMEOUT au processus appelant. Le délai d'attente par défaut est de 60 secondes.
Il peut être changé en démarrant le bus avec un argument -t.
L'identifiant du message placé dans *msg_id doit être sauvegardé et passé en argument à mb_reply
.
Un message MB_REPLY est reçu en réponse à un message MB_TWOWAY ou MB_ONEWAY ou MB_MULTIWAY. Dans le premier cas, il contient ce qui a été retourné par le processus communicant. Dans les deux autres cas, il contient un message vide retourné par le bus qui indique que la transmission a réussi.
Des messages MB_NOBODY et MB_TIMEOUT sont vides. Ils signalent une erreur. Ils sont envoyés directement par le bus quand aucun processus n'est enregistré avec le nom passé en argument à mb_send
ou si le processus appelé ne répond pas dans les temps à un message MB_TWOWAY.
Des messages MB_REGISTER et MB_PROBE sont envoyés directement par le bus en réponse à une requête du même type.
Ils contiennent une chaîne de caractères en ASCII terminée par un '\0' donnant le nombre de processus enregistrés avec le nom passé en argument à mb_register
ou mb_probe
.
Cette chaîne de caractères peut être convertie en entier avec atoi
.
Si rien ne peut être lu du connecteur socket, mb_receive
retourne 0.
En cas d'erreur, mb_receive
retourne -1 et la variable globale errno contient le code de l'erreur.
IMPORTANT : Dès qu'un message a été traité, la mémoire allouée à l'adresse *msg doit être libérée :
if ( *msg ) {
free( *msg );
}
Quand un message est vide, *msg_len vaut 0 ainsi que *msg.
Commentaires