next up previous
Next: About this document ... Up: Exemplo2: Cliente-servidor Previous: Exemplo cliente-servidor com 1

Exemplo cliente-servidor com 2 filas

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


Celso Alberto Saibel Santos 2000-11-14