Click to See Complete Forum and Search --> : ATM Program "server.c program"


psiubest
December 1st, 2002, 07:45 PM
****************************************************
server program



#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>

#define FIFO_NAME "request"
#define FILE_NAME "conta.txt"
#define MAXBUFO 100
#define MAXBUF 100
#define MAXBUFA 100


void *escreve(void *);
void le_ficheiro(void);
void cria_conta(char *, int);
int compara(const void*, const void*);
void le_saldo(char *);
void levanta_dinheiro(char *, int);
void deposita_dinheiro(char *, int);
void cria_conta(char *, int);
void listacontas(void);
void shutdown(void);
void escreve_ficheiro(void);

typedef struct ficha
{
char nome[50];
int saldo;
}contas;

contas *conta;
int num_contas, flag = 0;
char resposta[MAXBUFA];


int main(void)
{
FILE *fp;
char buf[MAXBUF];
char caracter;
int cont = 0;
char *temp;

pthread_t tid;

le_ficheiro();
qsort(conta, num_contas, sizeof(contas), compara);

mkfifo("./request", 0644);
fp = fopen(FIFO_NAME, "r");


//while(flag == 0);
//{
caracter = fgetc(fp);
while(caracter != EOF)
{
if(caracter == '\0')
{
buf[cont] = '\0';
cont++;
}

else
{
buf[cont] = caracter;
cont++;
}
caracter = fgetc(fp);
}

fclose(fp);

temp = (char *)malloc(cont);
strcpy(temp, buf);




pthread_create(&tid, NULL, escreve, (void *)temp);
//onde foi colocado o que estava o que veio do FIFO
pthread_join(tid, NULL);
//}

unlink("./request");
escreve_ficheiro();
return 0;
}


void le_ficheiro(void)
{
FILE *fp;
char caracter;
char name[100], saldos[100], n_contas[100];
int cont=0, conto=0, contu=0, n=0, i=0, salda;


fp = fopen(FILE_NAME, "r");

caracter = fgetc(fp);
while(caracter != EOF)
{
if(n == 0)
{
if(caracter == '\n')
{
n_contas[cont] = '\0';
cont = 0;
n++;
}
else
{
n_contas[cont] = caracter;
cont++;
}
caracter = fgetc(fp);

num_contas = atoi(n_contas);
conta = (contas*) malloc(sizeof(contas) * num_contas);
}
else
if(n == 1)
{
if(caracter == '|')
{
name[conto] = '\0'; //termina as strings que contêm os nomes
conto = 0;
n++;
strcpy(conta[i].nome, name); }
}
else
{
name[conto] = caracter;
conto++;
}
caracter = fgetc(fp);
}
else
if(n == 2)
{
if(caracter == '\n')
{
saldos[contu] = '\0';
contu = 0;
n--;
salda = atoi(saldos);
conta[i].saldo = salda;
i++;
}
else
{
saldos[contu] = caracter;
contu++;
}
caracter = fgetc(fp);
}

}

fclose(fp);

return;
}




int compara(const void *a, const void *b)
{
return strcasecmp(a, b);
}

void *escreve(void *arg)
{
char pide[MAXBUFO], operacao[MAXBUFA], cliente[MAXBUFA], montante[MAXBUFA], name[20];
char caracter;
int wf, n = 1, opera, montant;
int cont = 0, conta = 0, conto = 0, contu = 0, contador = 0;

char *meu_buf;
meu_buf = (char *)arg;

printf("\n O que vem do cliente e: %s\n", meu_buf);

caracter = meu_buf[contador];
while(caracter != '\0')
{
if(n == 1)
{
if(caracter == '|') "|"
{
pide[conta] = '\0';
conta++;
n++;
}
else
{
pide[conta] = caracter;
conta++;
}
contador++;
caracter = meu_buf[contador];
}

if(n == 2)
{
if(caracter == '|') "|"
{
operacao[cont] = '\0';
cont++;
n++;
}
else
{
operacao[cont] = caracter;
cont++;
}
contador++;
caracter = meu_buf[contador];
}

if(n == 3)
{
if(caracter == '|') "|"
{
cliente[conto] = '\0';
printf("{%s}\n", cliente);
conto++;
n++;
}
else
{
cliente[conto] = caracter;
conto++;
}
contador++;
caracter = meu_buf[contador];
}

if(n == 4)
{
montante[contu] = caracter;
contu++;
contador++;
caracter = meu_buf[contador];
}
}
montante[contu] = '\0';

opera = atoi(operacao);
montant = atoi(montante);

switch(opera)
{
case 1:
le_saldo(cliente);
break;

case 2:
levanta_dinheiro(cliente, montant);
break;

case 3:
deposita_dinheiro(cliente, montant);
break;

case 4:
cria_conta(cliente, montant);
break;

case 5:
listacontas();
break;

case 6:
shutdown();
break;
}


sprintf(name, "./ans%s", pide);
wf=open(name, O_WRONLY);
write(wf, resposta, strlen(resposta)+1);
return 0;
}


void le_saldo(char *cliente)
{
int montante;
contas *user;

printf("\n\n [%s]\n\n", cliente);

user = bsearch(cliente, conta, num_contas, sizeof(contas), compara);

if(user != NULL)
{
montante = user->saldo;
printf("\n\n O saldo do %s e de %d euros \n\n", cliente, montante);
sprintf(resposta,"O saldo do %s e de %d euros", cliente, montante);
}
else
{
printf("\n\n Não existe a conta da qual pretende saber o saldo \n\n");
sprintf(resposta, "Não existe a conta da qual pretende saber o saldo");
}

return;
}


void levanta_dinheiro(char *cliente, int montant)
{
int saldo;
contas *user;

user = bsearch(cliente, conta, num_contas, sizeof(contas), compara);

if(user == NULL) {
printf("\n\n Não existe a conta da qual pretende levantar %d euros\n\n", montant);
sprintf(resposta, "Não existe a conta da qual pretende levantar %d euros", montant);
}
else
{
if((((contas *)user)->saldo) - montant < 0)
{
printf("\n\n O seu saldo nao lhe permite efectuar essa operacao\n\n");
sprintf(resposta, "O seu saldo nao lhe permite efectuar essa operacao");
}
else
{
saldo = (((contas *)user)->saldo) - montant;
(((contas *)user)->saldo) = saldo;
printf("\n\n Foi efectuado um levantamento de %d euros\n\n", montant);
sprintf(resposta, "Foi efectuado um levantamento de %d euros", montant);
}
}

return;
}

void deposita_dinheiro(char *cliente, int montant)
{
int saldo;
contas *user;

user = bsearch(cliente, conta, num_contas, sizeof(contas), compara);
if(user == NULL)
{
printf("\n\n Não existe a conta na qual pretende depositar %d euros\n\n", montant);
sprintf(resposta, "Não existe a conta na qual pretende depositar %d euros", montant);
}
else
{
saldo = (((contas *)user)->saldo) + montant;
(((contas *)user)->saldo) = saldo;
printf("\n\n Foi efectuado um deposito de %d euros\n\n", montant);
sprintf(resposta, "Foi efectuado um deposito de %d euros", montant);
}

return;
}


void cria_conta(char *cliente, int montant)
{
contas *user;
contas *temporario;

user = bsearch(cliente, conta, num_contas, sizeof(contas), compara);

if(user == NULL)
{
num_contas++;

temporario = (contas*) malloc(sizeof(contas) * num_contas);

memcpy(temporario, conta, sizeof(contas)*(num_contas - 1));

free(conta);

conta = temporario;

strcpy(conta[num_contas -1].nome, cliente);
conta[num_contas -1].saldo = montant;
}

return;
}


void listacontas(void)
{
int i = 0;

for (i = 0; i < num_contas ;i++ )
{
printf("\n | %s | %d |", conta[i].nome, conta[i].saldo);
sprintf(resposta, "| %s | %d |", conta[i].nome, conta[i].saldo);
}


return;
}


void escreve_ficheiro(void)
{
FILE *fw;
int i = 0;

fw = fopen(FILE_NAME, "w");

fprintf(fw, "%d\n", num_contas);

for(i = 0; i < num_contas; i++)
{
fprintf(fw, "%s|%d\n", conta[i].nome, conta[i].saldo);
}

return;
}

galathaea
December 1st, 2002, 10:13 PM
I've read all of your posts and have some ponters. First, if you check the vB Code help (on the screen you write your post with), it will show you a better method of placing your code in

like this
that preserves indentation

and, since your code is quite long, I'd suggest using a highlighting utility to help us read it since there are no comments. The code is simple enough (a basic client-server app), but you really should have narrowed it down to only the relevant sections and not given us the entire specifications. I understand that you are in a hurry, but you have to understand that we can help you much faster if you do the filtering of unnecessary information for us.

Also, you should have kept everything in one thread. Each thread should be a logical whole. As it is, we need to switch between threads to get the specifications and the code, and I for one can't keep all of that in my head at once. I understand that this is not the kind of help that you wanted, but it is a clarification of the kind of questions that we want. Because as is, with all code in basically c format (no object encapsulation to guide us) and no comments and no indentation, you are much less likely to get any help in the time you need it by. Plus, the large list of specifications really obscures the problems you are actually having (though I did find that area of your post)...