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;
}
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;
}