Código do servidor
/* arquivo server1.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 TYPE_CLIENT 1 /* tipo de mensagens enderacadas
* ao cliente */
#define TYPE_SERVEUR 2 /* tipo de mensagens enderecadas
* ao servidor */
#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; /* identificador da fila de mensagens */
/* criacao da fila de mensagens */
if ((msgid = msgget(MSGKEY, RW|IPC_CREAT)) == -1) {
perror("Erro na criacao da fila") ;
exit(1) ;
}
for (;;) {
/* recepcao de mensagens */
if (msgrcv(msgid, &msg,MSG_SIZEMAX,TYPE_SERVEUR, 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 = TYPE_CLIENT ;
msg.pid = getpid();
if (msgsnd(msgid, &msg, MSG_SIZEMAX , 0) == -1) {
perror("Erro no envio da mensagem") ;
exit(1) ;
}
}
exit(0);
}
Código do cliente
/* arquivo client1.c */
#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <string.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 TYPE_CLIENT 1 /* tipo de mensagens enderecadas
* ao cliente */
#define TYPE_SERVEUR 2 /* tipo de mensagens enderecadas
* ao servidor */
struct msgform {
long mtype;
int pid;
char mtext[MSG_SIZE_TEXT];
} ;
int main(int argc, char *argv[]) {
struct msgform msg; /* mensagem */
int msgid; /* identificador da fila do servidor */
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 = msgget(MSGKEY,0)) == -1) {
perror("Erro na criacao da fila do servidor") ;
exit(1) ;
}
/* envio de mensagens */
strcpy(msg.mtext,message1) ;
printf("Cliente: envio de mensagem: %s\n",msg.mtext) ;
msg.pid= getpid();
msg.mtype = TYPE_SERVEUR ;
if (msgsnd(msgid,&msg,MSG_SIZEMAX,0) == -1) {
perror("Erro no envio de mensagem") ;
exit(1) ;
}
/* recepcao de mensagem (ack de recepcao) */
printf("Cliente: espera de ack do servidor\n") ;
if (msgrcv(msgid, &msg, MSG_SIZEMAX, TYPE_CLIENT, 0) == -1) {
perror("Erro na recepcao de mensagem") ;
exit(1) ;
}
printf("Cliente %d recebeu um ack do servidor %d\n",
getpid(), msg.pid);
exit(0);
}
Resultado da execução:
lyapunov:~> server1 & [2] 3575 lyapunov:~> client1 Cliente: envio de mensagem: Texto da mensagem O servidor 3575 recebeu uma mensagem do cliente 3576 Texto da mensagem: Texto da mensagem Cliente: espera de ack do servidor Cliente 3576 recebeu um ack do servidor 3575 lyapunov:~> client1 "NOVA MENSAGEM DO USUARIO" Cliente: envio de mensagem: NOVA MENSAGEM DO USUARIO O servidor 3575 recebeu uma mensagem do cliente 3577 Texto da mensagem: NOVA MENSAGEM DO USUARIO Cliente: espera de ack do servidor Cliente 3577 recebeu um ack do servidor 3575 lyapunov:~>