|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Aug 2006
Messaggi: 1
|
programmazione socket|| esame per dopodomani notte help!!
ciao, devo consegnare un programma funzionante per dopodomani notte e mi si inceppa sulle librerie; la traccia e' su http://taurus.polito.it/~lioy/01fqt/pad06_hw1c.pdf
vi posto il programma che ho fatto sperando che mi possiate aiutare. grazie uso dev-c con il winsock, ma da' problemi di undefined(tra gli altri) #include <windows.h> #include <winsock.h> #include <stdio.h> #include <errno.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 } 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 } else // senza - { err_quit("Usage: %s invalid parameter; enter -[fpn] parameter", prog); } } // end for } // 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); } } |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:48.



















