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