Qualcuno può aiutarmi?
Salve ragazzi, ho realizzato un'applicazione client server "pari/dispari". Il client invia al server un'operazione del tipo 3*2 il server calcola il risultato e lo restituisce al client. Il client verifica se è pari o dispari e restituisce la risposta al server che la stampa a video.
Il problema è che all'inizio funziona, poi dopo un pò di volte il server riceve l'operazione + un carattere estraneo e il tutto si blocca. Potreste controllare il codice? Ci sto perdendo ore e ore. Grazie
Client
#include <stdio.h>
#include <stdlib.h>
#include "basic.h"
#include "my_inet.h"
void paridispari_cli(int);
int main(int argc, char *argv[])
{
struct sockaddr_in servaddr;
int sa;
if((sa=socket(AF_INET, SOCK_STREAM, 0))<0)
err_sys("Errore nella socket");
bzero((char*)&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
servaddr.sin_addr.s_addr=inet_addr(argv[1]);
if(connect(sa,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
err_sys("Errore nella accept");
paridispari_cli(sa);
}
void paridispari_cli(int socket){
char positivo[]="SI", negativo[]="NO";
char rcvline[MAXLINE]="",sendline[MAXLINE]="";
int n,argomento=0;
while(fgets(sendline,MAXLINE,stdin)!=NULL){
if((n=writen(socket,sendline, strlen(sendline)))<0){
if(errno==EPIPE)
err_sys("Connessione del server chiusa prematuramente");
else
err_sys("Errore nella writen");}
printf("Ho inviato %sciao",sendline);
if((n=readline(socket,rcvline,MAXLINE))<0)
err_sys("Errore nella readline");
if(n==0)
err_sys("Server morto prematuramente");
printf("Ho letto %sciao",rcvline);
rcvline[strlen(rcvline)-1]='\0';
sscanf(rcvline, "%d", &argomento);
if((argomento%2)==0){
printf("%dargomento",argomento);
positivo[strlen(positivo)]='\n';
if((n=writen(socket,positivo,strlen(positivo)))<0){
if(errno==EPIPE)
err_sys("Connessione del server chiusa prematuramente");
else
err_sys("Errore nella writen");}}
if((argomento%2)!=0){
printf("%dargomento",argomento);
negativo[strlen(negativo)]='\n';
if((n=writen(socket,negativo,strlen(negativo)))<0){
if(errno==EPIPE)
err_sys("Connessione del server chiusa prematuramente");
else
err_sys("Errore nella writen");}}
strcpy(positivo,"SI");
strcpy(negativo,"NO");
}}
SERVER
#include <stdio.h>
#include <stdlib.h>
#include "basic.h"
#include "my_inet.h"
#include "my_signal.h"
#include <string.h>
void paridispari_srv(int);
int main(int argc, char *argv[])
{
struct sockaddr_in servaddr,cliaddr;
int sa,sc,cli_len,pid;
if((sa=socket(AF_INET, SOCK_STREAM,0))<0)
err_sys("Errore nella socket");
bzero((char*)&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sa,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
err_sys("Errore nella bind");
if(listen(sa,8)<0)
err_sys("Errore nella listen");
if(signal(SIGCHLD, gestisci_zombie)<0)
err_sys("Errore nella signal");
for(;;){
cli_len=sizeof(cliaddr);
if((sc=accept(sa,(struct sockaddr*)&cliaddr,&cli_len))<0){
if(errno=EINTR)
continue;
else
err_sys("Errore nella accept");}
if((pid=fork())==0){
if(close(sa)<0)
err_sys("Errore nella close socket ascolto (figlio)");
paridispari_srv(sc);
if(close(sc)<0)
err_sys("Errore nella close socket connesso (figlio)");
exit(0);}
if(close(sc)<0)
err_sys("Errore nella close socket connesso (padre)");
}}
void paridispari_srv(int sock){
char sendline[MAXLINE]="", rcvline[MAXLINE]="",rcvline1[MAXLINE]="";
int addendo1=0, addendo2=0,risultato=0,n;
char operatore=' ';
for(;;){
printf("SONO QUI");
if((n=readline(sock,rcvline,MAXLINE))<0)
err_sys("Errore nella readline");
rcvline[strlen(rcvline)-1]='\0';
printf("Ho ricevuto %s",rcvline);
sscanf(rcvline, "%d %c %d", &addendo1, &operatore, &addendo2);
printf("Addendo1:%d Operatore:%c Addendo2:%d",addendo1,operatore,addendo2);
/*switch(operatore){
case '+': risultato=addendo1+addendo2;printf("Risultato:%d",risultato);break;
case '-': risultato=addendo1-addendo2;printf("Risultato:%d",risultato);break;
case '*': risultato=addendo1*addendo2;printf("Risultato:%d",risultato);break;
case '/': risultato=addendo1/addendo2;printf("Risultato:%d",risultato); break;
default: printf("Operazione non eseguibile\n");break;}*/
if(operatore=='+'){
risultato=addendo1+addendo2;
printf("Risultato %d",risultato);
}
else if(operatore=='-'){
risultato=addendo1-addendo2;
printf("Risultato %d",risultato);
}
else if (operatore=='*'){
risultato=addendo1*addendo2;
printf("Risultato %d",risultato);
}
else if (operatore=='/'){
risultato=addendo1/addendo2;
printf("Risultato %d",risultato);
}
else
printf("Operazione non effettuabile");
sprintf(sendline, "%d", risultato);
sendline[strlen(sendline)]='\n';
if((n=writen(sock,sendline,strlen(sendline)))<0)
err_sys("Errore nella writen");
printf("Ho inviato il risultato %s",sendline);
if((n=readline(sock,rcvline1,MAXLINE))<0)
err_sys("Errore nella receiveline");
printf("Ho ricevuto %s",rcvline1);
rcvline1[strlen(rcvline1)-1]='\0';
if(strcmp(rcvline1,"SI")==0){
printf("Il risultato è pari\n\n");}
else
printf("Il risultato è dispari\n\n");
}
}
GRAZIE