Código do servidor
/* arquivo server2.c */
#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#define MSGKEY 13 /* chave associada a fila */
#define MSG_SIZE_TEXT 256 /* tamanho do texto das mensagens */
#define MSG_SIZEMAX 260 /* MSG_SIZE_TEXT + sizeof(int) */
/* tamanho total das mensagens */
#define RW 0600 /* flag para permissao leitura e escrita */
struct msgform {
long mtype;
int pid;
char mtext[MSG_SIZE_TEXT];
} ;
int main() {
struct msgform msg; /* mensagem */
int msgid_serv; /* identificador da fila do servidor */
int msgid_client; /* identificador da fila do cliente */
/* criacao da fila de mensagens do servidor */
if ((msgid_serv = msgget(MSGKEY, RW|IPC_CREAT)) == -1) {
perror("Erro na criacao da fila do servidor") ;
exit(1) ;
}
/* criacao da fila de mensagens do cliente */
if ((msgid_client = msgget(MSGKEY+1, RW|IPC_CREAT)) == -1) {
perror("Erro na criacao da fila do cliente") ;
exit(1) ;
}
for (;;) {
/* recepcao de mensagens */
if (msgrcv(msgid_serv,&msg,MSG_SIZEMAX,1,0) == -1) {
perror("Erro na recepcao da mensagem") ;
exit(1) ;
}
printf("O servidor %d recebeu uma mensagem do cliente %d\n",
getpid(),msg.pid);
printf("Texto da mensagem: %s\n", msg.mtext) ;
/* envio de mensagem */
msg.mtype = 1 ;
msg.pid = getpid();
if (msgsnd(msgid_client, &msg, MSG_SIZEMAX , 0) == -1) {
perror("Erro no envio da mensagem") ;
exit(1) ;
}
}
exit(0);
}
Código do cliente
/* arquivo client2.c */
#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#define MSGKEY 13 /* chave associada a fila */
#define MSG_SIZE_TEXT 256 /* tamanho do texto das mensagens */
#define MSG_SIZEMAX 260 /* MSG_SIZE_TEXT + sizeof(int) */
/* tamanho total das mensagens */
struct msgform {
long mtype;
int pid;
char mtext[MSG_SIZE_TEXT];
} ;
int main(int argc, char *argv[]) {
struct msgform msg; /* mensagem */
int msgid_serv; /* id da fila do servidor */
int msgid_client; /* id da fila do cliente */
char message1[32];
/* definicao do texto da mensagem : client1 <argumento>
* se <argumento> e vazio, um valor default e enviado */
if (argc > 1) strcpy(message1,argv[1]);
else strcpy(message1,"Texto da mensagem");
/* recuperacao do id da fila de mensagens do servidor */
if ((msgid_serv = msgget(MSGKEY,0)) == -1) {
perror("Erro na recuperacao do ID da fila") ;
exit(1) ;
}
/* recuperacao do id da fila de mensagens do servidor */
if ((msgid_client = msgget(MSGKEY+1,0)) == -1) {
perror("Erro na recuperacao do ID da fila") ;
exit(1) ;
}
/* envio de mensagem */
strcpy(msg.mtext,message1) ;
msg.pid= getpid();
msg.mtype = 1;
printf("Cliente: envio da mensagem: %s\n",msg.mtext) ;
if (msgsnd(msgid_serv,&msg,MSG_SIZEMAX,0) == -1) {
perror("Erro no envio da mensagem") ;
exit(1) ;
}
/* recepcao de uma mensagem (ack de recepcao) */
printf("Cliente: espera de ack do servidor\n") ;
if (msgrcv(msgid_client, &msg, MSG_SIZEMAX, 1, 0) == -1) {
perror("Erro na recepcao da mensagem") ;
exit(1) ;
}
printf("Cliente %d recebeu um ack do servidor %d\n",
getpid(), msg.pid);
exit(0);
}
Resultado da execução:
lyapunov:~> server2 & [2] 3650 lyapunov:~> client2 Cliente: envio da mensagem: Texto da mensagem O servidor 3650 recebeu uma mensagem do cliente 3651 Texto da mensagem: Texto da mensagem Cliente: espera de ack do servidor Cliente 3651 recebeu um ack do servidor 3650 lyapunov:~> client2 "NOVA MENSAGEM DE TEXTO!" Cliente: envio da mensagem: NOVA MENSAGEM DE TEXTO! O servidor 3650 recebeu uma mensagem do cliente 3654 Texto da mensagem: NOVA MENSAGEM DE TEXTO! Cliente: espera de ack do servidor Cliente 3654 recebeu um ack do servidor 3650 lyapunov:~>