next up previous
Next: Exemplo cliente-servidor com 2 Up: Exemplo2: Cliente-servidor Previous: Exemplo2: Cliente-servidor

Exemplo cliente-servidor com 1 fila

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



Celso Alberto Saibel Santos 2000-11-14