CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 2 of 2
  1. #1
    Join Date
    Nov 2002
    Posts
    4

    ATM Program "server.c program"

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

  2. #2
    Join Date
    Sep 2002
    Posts
    1,747

    not much help

    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
    Code:
    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)...
    */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

    "It's hard to believe in something you don't understand." -- the sidhi X-files episode

    galathaea: prankster, fablist, magician, liar

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured