Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    8

    ambiente di programmazione socket in c

    Ciao, sapete sotto windows che programmi posso usare per compilare, debuggare... un programma scritto in c su un client/server. sto usando il dev-c ma da problemi sulle librerie: includo quelle scritte sul programma, ma queste probabilmente fanno riferimento ad altre e ne vengono davvero giù troppe, in alternativa sapete dove posso trovare delle librerie complete per i socket e funzionalità credo base per far girare un programma in c sotto windows? Aspetto notizie grazie

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    winsock e credo che sia l'unica esistente !
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    8

    non basta

    da problemi di continue mancanze nelle library

    1 C:\Dev-Cpp\include\sys\socket.h:26, from C:\Dev-Cpp\include\sockwrap.h In file included from C:/Dev-Cpp/include/sys/socket.h:26, from C:/Dev-Cpp/include/sockwrap.h

    11 C:\Dev-Cpp\include\sockwrap.h:1, from C:\Dev-Cpp\server.cpp from C:/Dev-Cpp/include/sockwrap.h:1, from C:\Dev-Cpp\server.cpp

    11 C:\Dev-Cpp\server.cpp from C:\Dev-Cpp\server.cpp

    /Dev-Cpp/include/features.h C:\Dev-Cpp\C sys/cdefs.h: No such file or directory.

    forse dovuto a qualche baco della libreria(possibile?)

    Fatto sta che confusione o meno non parte, in seguito posto il programma sperando qualcuno piu' esperto di me possa aiutarmi.
    E' ancora incompleto (non gira) anche per qualche erroretto(parentesi etc...) che ora aggiustero'...

    #include <windows.h>
    #include <winsock.h>
    #include <stdio.h>

    #include "errlib.h"
    #include "sockwrap.h"
    #ifndef socklen_t
    #define socklen_t uint32_t
    #endif



    #define MAX 256
    #define MAXSTR 30
    #define MAXBUF 255
    #define SEPARATORE ";"
    #define uint32_t
    #define LISTENQ 15

    #define PORTA_DFT 54321
    #define UTENTI_DFT 2
    #define FILE_DFT "prodotti.txt"

    char *prog;
    int num_utenti=0;

    void sigchld_h(int signum);
    uint32_t Find(char *nomefile,char *prodotto,uint8_t Q);


    int main (int argc, char *argv[]){
    // inizializzazioni
    int listenfd, connfd;
    struct sockaddr_in servaddr, cliaddr;
    socklen_t cliaddrlen;
    pid_t pid;
    uint8_t zero=0, dcc=255, last, Q;
    uint16_t porta=0, prezzo;
    uint32_t somma=0, nsomma;

    int utenti=0, i, f, flag;
    char *nomefile=(char *)malloc(sizeof(char)*MAXBUF);
    char *temp1=(char *)malloc(sizeof(char)*MAXBUF);
    char *temp2=(char *)malloc(sizeof(char)*MAXBUF);
    //char nome_utente[7];
    char line[255], ist[10];

    int auth_ret = 0;
    int ret=0;

    prog = argv[0];

    if(argc>4)
    {
    err_quit("Usage: %s too many arguments", prog);
    // con troppi parametri esco generando errore
    }
    else
    {
    if (argc >1 )
    for (i=1; i<argc ; i++)
    {
    if (argv[i][0]=='-') // se l'input e' scritto correttamante con il '-'
    {
    switch(argv[i][1]) // c'e' la scelta fra
    {
    case 'f': // nome del file da input
    memcpy(nomefile, &argv[i][2], MaxBUF);
    break;

    case 'p': // numero della porta da tastiera
    memcpy(temp1, &argv[i][2], MAXBUF);
    porta= atoi(temp1); // converto in intero
    break;

    case 'n': // numero di figli da tastiera
    memcpy(temp2, &argv[i][2], MAXBUF);
    utenti=atoi(temp2);
    break;

    default:
    err_quit("Usage: %s invalid parameter; enter -[fpn] parameter", prog);
    break;
    }
    else // senza -
    {
    err_quit("Usage: %s invalid parameter; enter -[fpn] parameter", prog);
    }
    }
    } // end if

    } //end else


    // se non sono stati inseriti da input imposto i parametri di default
    if ((memcpy(nomefile,"",strlen(nomefile)))==0)
    {
    memcpy(nomefile, FILE_DFT, MAXBUF);
    }

    if (porta==0)
    {
    porta= PORTA_DFT;
    }

    if (utenti= UTENTI_DFT)
    {
    utenti= UTENTI_DFT;
    }


    //inizializzazioni del socket di ascolto
    listenfd = Socket(AF_INET, SOCK_STREAM, 0);

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(porta);

    // funzioni principali: bind collega il socket al servaddr
    Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));
    // la listen si mette in ricezione
    Listen(listenfd, LISTENQ);
    // signal dovrebbe
    signal(SIGCHLD, sigchld_h);

    while(1){
    cliaddrlen = sizeof(cliaddr);
    connfd = Accept (listenfd, (SA*)&cliaddr, &cliaddrlen);

    if (num_utenti==utenti){
    Writen(connfd, "%u\r\n", dcc);
    Close(connfd);
    continue;
    }
    else {
    Writen(connfd,"%u\r\n", zero);
    num_utenti++;
    }
    // figlio
    if((pid=fork())==0){
    Close(listenfd);

    // valori iniziali dei parametri del figlio
    somma=0;
    f=1;
    Readline(connfd, line, MAX); //legge la linea di comando con l'istruzione
    while {strcmp(line,"")!=0) { // confronta la linea con l' insieme vuoto
    strncpy(ist,line, 3); // ritaglia le prime tre lettere

    if (strncmp(line,"USR",3)==0) // se è USR puo' passare dallo stato non autenticato
    // controlla se il messaggio del client e' ben formato
    byte=strlen(line); //restituisce iil numero di byte
    if (byte<10)
    f=0;
    // allo stato autenticato modificando la flag a 0 per permettere poi LST, ADD

    // cambiare ouput del server
    if ((strncmp(line,"LST",3)==0)&&(f==0)) // se è LST e sono in stato autenticato (f uguale a 0)
    {
    // legge dal messaggio prodotto e Quantità
    sscanf(line,"ADD%s:%u\r\n",prodotto,&Q);

    // apertura file
    FILE *fpt= fopen(nomefile,"r");
    // legge dal file il record
    while(fscanf(ftp,"%u%s:%u%u",&last, prodotto, &prezzo, &Q)!=EOF)
    {// e lo invia al client tramite connfd
    Writen(connfd,"%u%s:%u%u\r\n", last, prodotto, prezzo, Q);
    }
    }

    if ((strcmp(line,"ADD\r\n")==0)&&(f==0))
    {
    sscanf(line,"ADD%s:%u\r\n",prodotto, &Q); // ricopia prodotto e Quantita' dalla linea
    prezzo = Find(nomefile, prodotto, Q);
    if (prezzo==0)
    Writen("%u\r\n",0);
    else
    Writen("%u\r\n",2);

    somma=somma+prezzo;
    }

    if ((strncmp(line,"BYE\r\n")==0))
    {
    nsomma= hotnl(somma);
    if (f==0)
    Writen(connfd,"%u\r\n", nsomma);

    Close(connfd);
    }

    Readline(connfd, line, MAX); // legge la prossima istruzione dal client

    } // fine del while del menu' di esecuzione delle istruzioni

    } //fine dell if con la fork
    else{
    Close(connfd);
    }
    }

    exit(0);
    }


    uint32_t Find(nomefile, *prodotto, Q)
    {


    FILE *ftp;
    int qta =(int)Q;
    // apertura file
    ftp = fopen(nomefile,"r");

    fscanf(ftp,"%s;%d.%d;%d", prod, &prezzoint, &prezzodec, &quantita);
    while(ftp!=EOF){
    // confronta il record con le richieste del client
    if ((strcmp(prod,prodotto)==0)&&(quantita==qta))
    return // leggere senza il punto il prezzo dal file




    fscanf(ftp,"%s;%d.%d;%d", prodotto, &prezzoint, &prezzodec, &quantita);
    }
    }

  4. #4
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Conoscevo anche le librerie ACE...
    http://www.cs.wustl.edu/~schmidt/ACE.html
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    8

    modifiche al programma

    qualcuno puo' aiutarmi per favore a far girare il programma?
    sono un po' corto di tempo...


    #include <windows.h>
    #include <winsock.h>
    #include <stdio.h>
    #include <errno.h>
    #include <stdint.h>
    #include <signal.h>
    #include <unistd.h>

    #include "errlib.h"
    //#include "sockwrap.h"
    //#include "wrappers.h"

    #ifndef uint8_t
    #define uint_t8 u_int8_t
    #endif
    #ifndef uint16_t
    #define uint_t16 u_int16_t
    #endif

    #ifndef uint32_t
    #define uint_t32 u_int32_t
    #endif
    #ifndef socklen_t
    #define socklen_t uint32_t
    #endif

    #define SA struct sockaddr
    #define MAX 256
    #define MAXSTR 30
    #define MAXBUF 255
    #define SEPARATORE ";"
    #define LISTENQ 15

    #define PORTA_DFT 54321
    #define UTENTI_DFT 2
    #define FILE_DFT "prodotti.txt"
    #define SIGCHLD

    char *prog;
    int num_utenti=0;

    void sigchld_h(int signum);
    uint32_t find(char *nomefile,char *prodotto, uint8_t Q);


    int main(int argc, char **argv){
    // inizializzazioni
    int listenfd, connfd;
    struct sockaddr_in servaddr, cliaddr;
    int cliaddrlen;
    pid_t pid;
    uint8_t zero=0, dcc=255, last, Q;
    uint16_t porta=0, prezzo;
    uint32_t somma=0, nsomma;

    int utenti=0, i, f, flag;
    char *nomefile=(char *)malloc(sizeof(char)*MAXBUF);
    char *temp1=(char *)malloc(sizeof(char)*MAXBUF);
    char *temp2=(char *)malloc(sizeof(char)*MAXBUF);
    //char nome_utente[7];
    char line[255], ist[10], prodotto[10];

    int auth_ret = 0;
    int ret=0;

    prog = argv[0];

    if(argc>4)
    {
    err_quit("Usage: %s too many arguments", prog);
    // con troppi parametri esco generando errore
    }

    if (argc >1 )
    {
    for (i=1; i<argc ; i++)
    {
    if (argv[i][0]=='-') // se l'input e' scritto correttamante con il '-'
    {
    switch(argv[i][1]) // c'e' la scelta fra
    {
    case 'f': // nome del file da input
    memcpy(nomefile, &argv[i][2], MAXBUF);
    break;

    case 'p': // numero della porta da tastiera
    memcpy(temp1, &argv[i][2], MAXBUF);
    porta= atoi(temp1); // converto in intero
    break;

    case 'n': // numero di figli da tastiera
    memcpy(temp2, &argv[i][2], MAXBUF);
    utenti=atoi(temp2);
    break;

    default:
    err_quit("Usage: %s invalid parameter; enter -[fpn] parameter", prog);
    break;
    } // end switch
    }// end if argv con il -
    else // senza -
    {
    err_quit("Usage: %s invalid parameter; enter -[fpn] parameter", prog);
    }
    } // end for argomenti
    } //end if





    // se non sono stati inseriti da input imposto i parametri di default
    if ((memcpy(nomefile,"",strlen(nomefile)))==0)
    {
    memcpy(nomefile, FILE_DFT, MAXBUF);
    }

    if (porta==0)
    {
    porta= PORTA_DFT;
    }

    if (utenti= UTENTI_DFT)
    {
    utenti= UTENTI_DFT;
    }


    //inizializzazioni del socket di ascolto
    listenfd = socket(AF_INET, SOCK_STREAM, 0);

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(porta);

    // funzioni principali: bind collega il socket al servaddr
    bind(listenfd, (SA*)&servaddr, sizeof(servaddr));
    // la listen si mette in ricezione
    listen(listenfd, LISTENQ);
    // signal dovrebbe
    signal(SIGCHLD, sigchld_h);

    while((pid=fork())==0){
    cliaddrlen = sizeof(cliaddr);
    connfd = accept(listenfd,(SA*)&cliaddr,&cliaddrlen);

    if (num_utenti==utenti){
    send(connfd, "%u\r\n", dcc,MSG_OOB);
    close(connfd);
    continue;
    }
    else {
    send(connfd,"%u\r\n", zero, MSG_OOB);
    num_utenti++;
    }
    // figlio
    if((pid=fork())==0)
    {
    close(listenfd);

    // valori iniziali dei parametri del figlio
    somma=0;
    f=1;
    recv(connfd, line, MAX,MSG_OOB); //legge la linea di comando con l'istruzione
    while {strcmp(line,"")!=0) { // confronta la linea con l' insieme vuoto
    strncpy(ist,line, 3); // ritaglia le prime tre lettere
    switch(ist){

    case "USR":
    if (strncmp(line,"USR",3)==0) // se è USR puo' passare dallo stato non autenticato
    // controlla se il messaggio del client e' ben formato
    byte=strlen(line); //restituisce iil numero di byte
    if (byte<10)
    f=0;
    // allo stato autenticato modificando la flag a 0 per permettere poi LST, ADD
    break;

    case "LST":
    // cambiare ouput del server
    if ((strncmp(line,"LST",3)==0)&&(f==0)) // se è LST e sono in stato autenticato (f uguale a 0)
    {
    // legge dal messaggio prodotto e Quantità
    sscanf(line,"ADD%s:%u\r\n",prodotto,&Q);

    // apertura file
    FILE *fpt= fopen(nomefile,"r");
    // legge dal file il record
    while(fscanf(ftp,"%u%s:%u%u",&last, prodotto, &prezzo, &Q)!=EOF)
    {
    // e lo invia al client tramite connfd
    // send(connfd,"%u%s:%u%u\r\n", last, prodotto, prezzo, Q);
    }
    }
    break;

    case "ADD":

    if ((strcmp(line,"ADD\r\n")==0)&&(f==0))
    {
    sscanf(line,"ADD%s:%u\r\n",prodotto, &Q); // ricopia prodotto e Quantita' dalla linea
    prezzo = find(nomefile, prodotto, Q);
    if (prezzo!=0)
    send(connfd,"%u\r\n",0);
    else
    send(connfd,"%u\r\n",2);

    somma = somma + prezzo;
    }
    break;

    case "BYE":
    if ((strncmp(line,"BYE\r\n")==0))
    {
    nsomma=hotnl(somma);
    if (f==0)
    send(connfd,"%u\r\n", nsomma);

    close(connfd);
    }
    break;

    default:
    send(connfd,"%u\r\n",1);
    break;

    } // fine dello switch
    recv(connfd, line, MAX, MSG_OOB); // legge la prossima istruzione dal client

    } // fine del while del menu' di esecuzione delle istruzioni

    } //fine dell if con la fork (figlio)
    else
    {
    close(connfd);
    }
    } // fine del while

    exit(0);
    } //fine del main


    uint32_t find(nomefile, prodotto, Q)
    {
    char prezzoint[3],prezzodec[2], prod[10];
    uint32_t prezzo;
    FILE *ftp;
    int quantita;
    int qta =(int)Q;
    // apertura file
    ftp = fopen(nomefile,"r");


    fscanf(ftp,"%s;%s.%s;%d", prod, prezzoint, prezzodec, &quantita);
    while(ftp!=EOF){
    // confronta il record con le richieste del client
    // se lo riconosce
    if ((strcmp(prod,prodotto)==0)&&(quantita==qta))
    {
    strcat(prezzoint, prezzodec);
    sscanf(prezzoint,"%d",prezzo);
    return prezzo; // leggere il prezzo dal file senza il punto
    }
    // legge la riga dopo
    fscanf(ftp,"%s;%d.%d;%d", prodotto, &prezzoint, &prezzodec, &quantita);
    }


    return 0;


    }


    void sigchld_h(int signum){

    pid_t pid;
    int status;
    while((pid=waitpid(-1,&status,WNOHANG))>0)
    #ifdef TRACE
    err_msg("(%s)info - figlio %d con status %d", prog, pid, status);
    #endif
    ;
    num_utenti--;
    }

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Comincia a formattare il codice in modo decente e cerca di farci capire cosa vorresti fare.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    8
    il testo dell' esame e' su
    http://taurus.polito.it/~lioy/01fqt/pad06_hw1c.pdf


    #include <windows.h>
    #include <winsock.h>
    #include <stdio.h>
    #include <errno.h>
    #include <stdint.h>
    #include <signal.h>
    #include <unistd.h>

    #include "errlib.h" // definisce err_msg e generici messaggi di errore

    #ifndef uint8_t
    #define uint_t8 u_int8_t
    #endif
    #ifndef uint16_t
    #define uint_t16 u_int16_t
    #endif

    #ifndef uint32_t
    #define uint_t32 u_int32_t
    #endif
    #ifndef socklen_t
    #define socklen_t uint32_t
    #endif

    #define SA struct sockaddr
    #define MAX 256
    #define MAXSTR 30
    #define MAXBUF 255
    #define SEPARATORE ";"
    #define LISTENQ 15

    #define PORTA_DFT 54321
    #define UTENTI_DFT 2
    #define FILE_DFT "prodotti.txt"
    #define SIGCHLD

    char *prog;
    int num_utenti=0;

    void sigchld_h(int signum);
    uint32_t find(char *nomefile,char *prodotto, uint8_t Q);


    int main(int argc, char **argv){
    // inizializzazioni
    int listenfd, connfd;
    struct sockaddr_in servaddr, cliaddr;
    int cliaddrlen;
    pid_t pid;
    uint8_t zero=0, dcc=255, last, Q;
    uint16_t porta=0, prezzo;
    uint32_t somma=0, nsomma;

    int utenti=0, i, f, flag;
    char *nomefile=(char *)malloc(sizeof(char)*MAXBUF);
    char *temp1=(char *)malloc(sizeof(char)*MAXBUF);
    char *temp2=(char *)malloc(sizeof(char)*MAXBUF);
    //char nome_utente[7];
    char line[255], ist[10], prodotto[10];

    int auth_ret = 0;
    int ret=0;

    prog = argv[0];

    if(argc>4)
    {
    err_quit("Usage: %s troppi argomenti", prog);
    // con troppi parametri esco generando errore
    }



    //riceve da tastiera -fnomefile -pporta -nfigli
    if (argc >1 )
    {
    for (i=1; i<argc ; i++)
    {
    if (argv[i][0]=='-') // se l'input e' scritto correttamante con il '-'
    {
    switch(argv[i][1]) // c'e' la scelta fra
    {
    case 'f': // nome del file da input
    memcpy(nomefile, &argv[i][2], MAXBUF);
    break;

    case 'p': // numero della porta da tastiera
    memcpy(temp1, &argv[i][2], MAXBUF);
    porta= atoi(temp1); // converto in intero
    break;

    case 'n': // numero di figli da tastiera
    memcpy(temp2, &argv[i][2], MAXBUF);
    utenti=atoi(temp2);
    break;

    default:
    err_quit("Usage: %s parametri non validi; digita -[fpn] parametri", prog);
    break;
    } // end switch
    }// end if argv con il -
    else // altriment senza -
    {
    err_quit("Usage: %s parametri non validi; digita -[fpn] parametrir", prog);
    }
    } // end for argomenti
    } //end if





    // se non sono stati inseriti da input imposto i parametri di default
    if ((memcpy(nomefile,"",strlen(nomefile)))==0)
    {
    memcpy(nomefile, FILE_DFT, MAXBUF);
    }

    if (porta==0)
    {
    porta= PORTA_DFT;
    }

    if (utenti== 0)
    {
    utenti= UTENTI_DFT;
    }


    //inizializzazioni del socket di ascolto
    listenfd = socket(AF_INET, SOCK_STREAM, 0);

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(porta);

    // funzioni principali: bind collega il socket al servaddr
    bind(listenfd, (SA*)&servaddr, sizeof(servaddr));

    // la listen si mette in ricezione
    listen(listenfd, LISTENQ);

    // signal dovrebbe catturare il segnale della morte del figlio
    signal(SIGCHLD, sigchld_h);

    while(1){
    cliaddrlen = sizeof(cliaddr);
    connfd = accept(listenfd,(SA*)&cliaddr,&cliaddrlen);

    if (num_utenti==utenti){
    send(connfd, "%u\r\n", dcc,MSG_OOB);
    close(connfd);
    continue;
    }
    else {
    send(connfd,"%u\r\n", zero, MSG_OOB);
    num_utenti++;
    }

    // genera il figlio che eseguira' il lavoro richiesto dal client
    if((pid=fork())==0)
    {
    close(listenfd);

    // valori iniziali dei parametri del figlio
    somma=0;
    f=1;
    recv(connfd, line, MAX,MSG_OOB); //legge la linea di comando con l'istruzione

    while {strcmp(line,"")!=0) { // confronta la linea con l' insieme vuoto
    strncpy(ist,line, 3); // ritaglia le prime tre lettere del messaggio del client
    // contenente il comendo da eseguire

    switch(ist){

    case "USR": // tramite se il comando USR e' ben formato si passa
    // dallo stato non autenticato(flag=1)
    // allo stato autenticato (flag=0)
    byte=strlen(line); //restituisce iil numero di byte
    if (byte<10) // la linea ha meno di 10 byte
    f=0;
    // passa allo stato autenticato con flag a 0 per permettere poi LST, ADD
    break;

    case "LST":
    // cambiare ouput del server
    if (f==0) // se sono in stato autenticato (f uguale a 0)
    {
    // legge dal messaggio prodotto e Quantità
    sscanf(line,"ADD%s:%u\r\n",prodotto,&Q);

    // apertura file
    FILE *fpt= fopen(nomefile,"r");
    // legge dal file il record e lo invia al client
    while(fscanf(ftp,"%u%s:%u%u",&last, prodotto, &prezzo, &Q)!=EOF)
    {
    // e lo invia al client tramite connfd (come e' la sintassi??)
    // send(connfd,"%u%s:%u%u\r\n", last, prodotto, prezzo, Q);
    }
    }
    break;

    case "ADD":

    if (f==0)
    {
    // prende prodotto e Quantita' dalla linea
    sscanf(line,"ADD%s:%u\r\n",prodotto, &Q);

    // ricerca nel file prodotto, verifica quantita' e ritorna il prezzo, se no da 0
    prezzo = find(nomefile, prodotto, Q);

    if (prezzo!=0)
    send(connfd,"%u\r\n",0); // invia 0 se ha trovato il record, come verifica
    else
    send(connfd,"%u\r\n",2); // invia 2 se non lo trova

    somma = somma + prezzo;
    }
    break;

    case "BYE":
    nsomma=hotnl(somma);
    if (f==0)
    send(connfd,"%u\r\n", nsomma);
    close(connfd);
    break;

    default:
    send(connfd,"%u\r\n",1);
    break;

    } // fine dello switch
    recv(connfd, line, MAX, MSG_OOB); // legge la prossima istruzione dal client

    } // fine del while del menu' di esecuzione delle istruzioni

    } //fine dell if con la fork (figlio)
    else
    {
    close(connfd);
    }
    } // fine del while

    exit(0);
    } //fine del main


    // cerca nel file prodtto e quantita e restituisce il prezzo
    // se non lo trova torna 0
    uint32_t find(nomefile, prodotto, Q)
    {
    char prezzoint[3],prezzodec[2], prod[10];
    uint32_t prezzo;
    FILE *ftp;
    int quantita;
    int qta =(int)Q;
    // apertura file
    ftp = fopen(nomefile,"r");

    // dal formato
    fscanf(ftp,"%s;%s.%s;%d", prod, prezzoint, prezzodec, &quantita);
    while(ftp!=EOF){
    // confronta il record con le richieste del client
    // se lo riconosce
    if ((strcmp(prod,prodotto)==0)&&(quantita==qta))
    {
    strcat(prezzoint, prezzodec);
    sscanf(prezzoint,"%d",prezzo);
    return prezzo; // leggere il prezzo dal file senza il punto
    }
    // legge la riga dopo
    fscanf(ftp,"%s;%d.%d;%d", prodotto, &prezzoint, &prezzodec, &quantita);
    }


    return 0;


    }


    void sigchld_h(int signum){

    pid_t pid;
    int status;
    while((pid=waitpid(-1,&status,WNOHANG))>0)
    #ifdef TRACE
    err_msg("(%s)info - figlio %d con status %d", prog, pid, status);
    #endif
    ;
    num_utenti--;
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    8
    come si mantiene la formattazione? l' ha fatta pero' non l' ha mantenuta

  9. #9
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Metti tra i tag "" il tuo codice
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    8

    codice formattato

    codice:
    #include <windows.h>
    #include <winsock.h>
    #include <stdio.h>
    #include <errno.h>
    #include <stdint.h>
    #include <signal.h>
    #include <unistd.h>
    
    #include "errlib.h" // definisce err_msg e generici messaggi di errore
    
    #ifndef uint8_t
        #define uint_t8 u_int8_t 
    #endif
    #ifndef uint16_t
        #define uint_t16 u_int16_t 
    #endif
    
    #ifndef uint32_t
        #define uint_t32 u_int32_t 
    #endif 
    #ifndef socklen_t
        #define socklen_t uint32_t 
    #endif
    
    #define SA struct sockaddr
    #define MAX 256
    #define MAXSTR 30
    #define MAXBUF 255
    #define SEPARATORE ";"
    #define LISTENQ 15
    
    #define PORTA_DFT 54321
    #define UTENTI_DFT 2
    #define FILE_DFT "prodotti.txt"
    #define SIGCHLD 
    
    char *prog;
    int num_utenti=0;
    
    void sigchld_h(int signum);
    uint32_t find(char *nomefile,char *prodotto, uint8_t Q);
    
    
    int main(int argc, char **argv){
    // inizializzazioni 
        int listenfd, connfd;
        struct sockaddr_in servaddr, cliaddr;
        int cliaddrlen;
        pid_t pid;
        uint8_t zero=0, dcc=255, last, Q;
        uint16_t porta=0, prezzo;
        uint32_t somma=0, nsomma;
    
        int utenti=0, i, f, flag;
        char *nomefile=(char *)malloc(sizeof(char)*MAXBUF);
        char *temp1=(char *)malloc(sizeof(char)*MAXBUF);
        char *temp2=(char *)malloc(sizeof(char)*MAXBUF);
        //char nome_utente[7];
        char line[255], ist[10], prodotto[10];
    
        int auth_ret = 0;
        int ret=0;
    
        prog = argv[0];
    
        if(argc>4)
         {
           err_quit("Usage: %s troppi argomenti", prog); 
           // con troppi parametri esco generando errore 
         }
    
    
    
        //riceve da tastiera -fnomefile -pporta -nfigli
       if (argc >1 )
         {
          for (i=1; i<argc ; i++) 
           {
            if (argv[i][0]=='-') // se l'input e' scritto correttamante con il '-' 
             {
              switch(argv[i][1]) // c'e' la scelta fra 
                {
                  case 'f': // nome del file da input
                      memcpy(nomefile, &argv[i][2], MAXBUF);
                      break;
    
                  case 'p': // numero della porta da tastiera
                      memcpy(temp1, &argv[i][2], MAXBUF);
                      porta= atoi(temp1); // converto in intero
                      break;
    
                  case 'n': // numero di figli da tastiera
                      memcpy(temp2, &argv[i][2], MAXBUF);
                      utenti=atoi(temp2);
                      break;
    
                  default: 
                      err_quit("Usage: %s parametri non validi; digita -[fpn] parametri", prog);
                      break; 
                 } // end switch
                }// end if argv con il - 
             else // altriment senza - 
                {
                  err_quit("Usage: %s parametri non validi; digita -[fpn] parametrir", prog);
                } 
             } // end for argomenti
          } //end if
    
    
    
    
    
        // se non sono stati inseriti da input imposto i parametri di default
        if ((memcpy(nomefile,"",strlen(nomefile)))==0)
          {
           memcpy(nomefile, FILE_DFT, MAXBUF); 
          }
    
        if (porta==0)
          {
           porta= PORTA_DFT; 
          } 
    
        if (utenti== 0)
          {
           utenti= UTENTI_DFT; 
          }
    
    
        //inizializzazioni del socket di ascolto
        listenfd = socket(AF_INET, SOCK_STREAM, 0);
    
        memset(&servaddr, 0, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port = htons(porta);
    
        // funzioni principali: bind collega il socket al servaddr 
        bind(listenfd, (SA*)&servaddr, sizeof(servaddr));
    
        // la listen si mette in ricezione 
        listen(listenfd, LISTENQ);
    
        // signal dovrebbe catturare il segnale della morte del figlio
        //signal(SIGCHLD, sigchld_h);
    
        while(1){
           cliaddrlen = sizeof(cliaddr);
           connfd = accept(listenfd,(SA*)&cliaddr,&cliaddrlen);
    
           if (num_utenti==utenti){
             send(connfd, "%u\r\n", dcc,MSG_OOB);
             close(connfd); 
             continue; 
            } 
           else {
             send(connfd,"%u\r\n", zero, MSG_OOB); 
             num_utenti++;
           } 
    
        // genera il figlio che eseguira' il lavoro richiesto dal client
        if((pid=fork())==0)
          {
           close(listenfd); 
    
        // valori iniziali dei parametri del figlio
           somma=0;
           f=1;
           recv(connfd, line, MAX,MSG_OOB); //legge la linea di comando con l'istruzione
    
           while {strcmp(line,"")!=0) { // confronta la linea con l' insieme vuoto
              strncpy(ist,line, 3); // ritaglia le prime tre lettere del messaggio del client
              // contenente il comendo da eseguire
    
              switch(ist){
    
                 case "USR": // tramite se il comando USR e' ben formato si passa 
                             // dallo stato non autenticato(flag=1) 
                             // allo stato autenticato (flag=0)
                     byte=strlen(line); //restituisce iil numero di byte
                     if (byte<10) // la linea ha meno di 10 byte
                        f=0; 
                                  // passa allo stato autenticato con flag a 0 per permettere poi LST, ADD 
                     break; 
    
                 case "LST": 
                             // cambiare ouput del server
                     if (f==0) // se sono in stato autenticato (f uguale a 0)
                      {
                             // legge dal messaggio prodotto e Quantità
                         sscanf(line,"ADD%s:%u\r\n",prodotto,&Q);
    
                             // apertura file
                         FILE *fpt= fopen(nomefile,"r");
                            // legge dal file il record e lo invia al client
                         while(fscanf(ftp,"%u%s:%u%u",&last, prodotto, &prezzo, &Q)!=EOF) 
                           {
                           // e lo invia al client tramite connfd (come e' la sintassi??)
                           // send(connfd,"%u%s:%u%u\r\n", last, prodotto, prezzo, Q);
                           }
                      }
                     break;
    
                 case "ADD":
    
                    if (f==0)
                        {
                          // prende prodotto e Quantita' dalla linea 
                          sscanf(line,"ADD%s:%u\r\n",prodotto, &Q); 
    
                          // ricerca nel file prodotto, verifica quantita' e ritorna il prezzo, se no da 0
                          prezzo = find(nomefile, prodotto, Q); 
    
                          if (prezzo!=0)
                            send(connfd,"%u\r\n",0); // invia 0 se ha trovato il record, come verifica
                          else
                            send(connfd,"%u\r\n",2); // invia 2 se non lo trova
    
                          somma = somma + prezzo;
                        }
                    break;
    
                 case "BYE":
                     nsomma=hotnl(somma);
                     if (f==0)
                        {send(connfd,"%u\r\n", nsomma); }
                     close(connfd);
                     break;
    
                 default:
                    send(connfd,"%u\r\n",1);
                    break;
    
                } // fine dello switch
                
                recv(connfd, line, MAX, MSG_OOB); // legge la prossima istruzione dal client
    
              } // fine del while del menu' di esecuzione delle istruzioni
    
            } //fine dell if con la fork (figlio) 
            else
             {
              close(connfd); 
             } 
           } // fine del while
    
      exit(0);
    } //fine del main
    
    
     // cerca nel file prodtto e quantita e restituisce il prezzo
    // se non lo trova torna 0
    uint32_t find(nomefile, prodotto, Q)
    {
        char prezzoint[3],prezzodec[2], prod[10]; 
        uint32_t prezzo; 
        FILE *ftp; 
        int quantita;
        int qta =(int)Q; 
        // apertura file 
        ftp = fopen(nomefile,"r"); 
    
        // dal formato 
        fscanf(ftp,"%s;%s.%s;%d", prod, prezzoint, prezzodec, &quantita);
        while(ftp!=EOF){
        // confronta il record con le richieste del client
        // se lo riconosce 
           if ((strcmp(prod,prodotto)==0)&&(quantita==qta)) 
            {
              strcat(prezzoint, prezzodec);
              sscanf(prezzoint,"%d",prezzo);
              return prezzo; // leggere il prezzo dal file senza il punto 
            } 
        // legge la riga dopo 
           fscanf(ftp,"%s;%d.%d;%d", prodotto, &prezzoint, &prezzodec, &quantita); 
        } 
        return 0; 
    }
    
    
    void sigchld_h(int signum){
    
       pid_t pid;
       int status;
       while((pid=waitpid(-1,&status,WNOHANG))>0)
         #ifdef TRACE 
         err_msg("(%s)info - figlio %d con status %d", prog, pid, status);
         #endif
       ;
       num_utenti--;
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.