Comunicação entre cliente e server usando message Queue

Iniciado por RM123, 27 de Maio de 2011, 11:55

tópico anterior - próximo tópico

RM123

Estou implementando um programa de comunicação enviando e recebendo dados entre um server e um cliente:

Tenho um problema ao gravar os dados num ficheiro e multiplicá-los por 3.0. O programa apenas está a fazê-lo para o primeiro número guardado no ficheiro.
Isto porque ao ler os números de um ficheiro input.asc o programa está a ler como uma única mensagem, e devia ler número a número e enviar para o server.
O ficheiro input.asc pode ter qualquer número por exemplo:
1.0
2.0
3.0

Como alterar esta parte do código para ler número a número para a mensagem?
A parte do código a alterar encontra-se a castanho.
Código:

Cliente:


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <string.h>

#include <ctype.h>

#include <fcntl.h>



#define SERVER 1L

typedef struct {

    long    msg_to;

    long    msg_fm;

    char    buffer[BUFSIZ];

} MESSAGE;



int mid;

key_t key;

struct msqid_ds buf;

MESSAGE msg;

FILE *inFile;



int main(int argc, char** argv) {



    //Aquiring Message Queue ID

    key = ftok(".", 'z');

    mid = msgget(key, 0);



    //Display Message Queue and Client ID

    printf("Message Queue ID: %d\n", mid);

    printf("Client ID: %ld\n", (long)getpid());



    //Opening input file, throw an error if invalid file

    inFile = fopen("input.asc", "r");

    if(inFile == NULL){

        printf("Unable to open File = input.asc");

        return 1;

    }



//Copy input into msg.buffer, loops breaks when EOF is reached

    int i = 0;

    while(1){

        msg.buffer = fgetc(inFile);

        if(msg.buffer==EOF){

            msg.buffer = '\0';

            break;

        }     
   i++;

    }


    //Displaying message before conversion of server

    printf("Message before conversion:\n");

    printf("%s\n", msg.buffer);



    //Getting Client PID and preparing message to message queue

    long iD = (long)getpid();

    msg.msg_to = SERVER;

    msg.msg_fm = (long)getpid();



    //Send message to Message Queue for Server, throws and error for invalid input

    if(msgsnd(mid, &msg, sizeof(msg.buffer), 0)==-1){

        perror("msgsnd");

        exit(-1);

    }



    //Client waits for response from Server, throws an error if invalid input

    if(msgrcv(mid, &msg, sizeof(msg), iD, 0)<0){

        perror("msgrcv");

        exit(-1);

    }



    //Display new converting message.

    printf("Message after conversion\n");

    printf("%s\n", msg.buffer);



    //Removing message queue

    msgctl(mid, IPC_RMID, (struct msqid_ds *) 0);



    //Client exits

    return (EXIT_SUCCESS);

}

[/b]


[/color]
Server:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <string.h>

#include <ctype.h>

#include <fcntl.h>









#define SERVER 1L

typedef struct {

    long    msg_to;

    long    msg_fm;

    char    buffer[BUFSIZ];

} MESSAGE;





int mid;

key_t key;

struct msqid_ds buf;

MESSAGE msg;



int inbin;

FILE *bin;

FILE *outasc;

int conta = 0;



int main(int argc, char** argv) {



    //Creating a message queue

    key = ftok(".", 'z');

    if((mid = msgget(key, IPC_CREAT | 0660))<0){

        printf("Error Creating Message Queue\n");

        exit(-1);

    }



    //Display Message Queue and Server ID

    printf("Message Queue ID: %d\n", mid);

    printf("Server ID: %ld\n", (long)getpid());   



    //Receiving message from client, throws and error if input is invalid

    if(msgrcv(mid, &msg, sizeof(msg.buffer), SERVER, 0)<0){

        perror("msgrcv");

        exit(-1);

    }



    //Aquiring Cliend PID to message return

    long client = msg.msg_fm;

   

    //Server displays received message

    printf("SERVER receives:\n");

    printf("%s\n", msg.buffer);

    float aux=atof(msg.buffer);

    printf("Conversion:%lf\n", aux);

   

    //Creating the file input.bin

   if((inbin = open("input.bin",O_WRONLY|O_TRUNC|O_CREAT,0600)) < 0)

   {

      perror("\nERRO NO input.bin!\n");

      exit(1);

   }

   else

   {

      printf("\n File input.bin read\n");

      printf("-------------------------\n\n");

      int i=0;

         while(msg.buffer != '\0'){

         write(inbin,&aux,sizeof(float));

         i++;

         conta++;//NUMERO DE DADOS LIDOS

         }                        

      }

   

   //Close the file input.bin

   int closeinbin = close(inbin);

   if(closeinbin < 0)

   {

      perror("\nERRO AO FECHAR O FICHEIRO input.bin\n");

      exit(1);

   }



   float tab[conta];



   //Open input.bin and saved the data

   int readinbin = fread(&tab,sizeof(tab),1,(bin=fopen("input.bin","r")));

   if(bin < 0 || readinbin < 0)

   {

      perror("\nOCORREU UM ERRO AO TENTAR ABRIR O FICHEIRO input.bin\n");

      exit(1);

   }

   //Close the file input.bin

   if(fclose(bin) < 0)

   {

      perror("\nERRO AO FECHAR input.bin!\n");

      exit(1);

   }



         

   //Criar o output.asc//

   if((outasc=fopen("output.asc","a")) < 0)

   {

      perror("ERRO AO ABRIR output.asc");

      exit(1);

   }



  /*convert all lowercase characters to uppercase

    int i;

    while(msg.buffer != '\0'){

        msg.buffer = toupper(msg.buffer);

        i++;

    }

*/



   //ESCRITA NO FICHEIRO output.asc//

   int a;

   for(a = 0; a < conta; a++)

   {

      char BUFFER[20];

      tab[a] = 3.0*tab[a];   //MULTIPLICAÇÃO POR 3   

      sprintf(BUFFER,"%f",tab[a]);

      fputs(BUFFER,outasc);

      fputs("\n",outasc);

      printf("Wrote: %f \n",tab[a]);

   }

if(fclose(outasc) < 0)

   {

      printf("ERRO AO FECHAR DO FICHEIRO");

      exit(1);

   }   



    //prep return message

    msg.msg_fm = SERVER;

    msg.msg_to = client;



    //send converting message back to client, throws and error if input is invalid

    if(msgsnd(mid, (struct MESSAGE*)&msg, sizeof(msg.buffer), 0)==-1){

        perror("msgsnd");

        exit(-1);

    }



    //server exits

    return (EXIT_SUCCESS);

}