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:~>