Salve a tutti, stavo lavorando su questo progetto ed andava tutto bene fino a quando in un determinato punto del programma quando il client riceve dei dati dal server questi arrivano tutti con i valori settati a 1 anche se il server li invia correttamente penso perchè glieli faccio stampare poco prima dell'invio. La cosa strana è che questo pezzo di codice che mi da problemi l'ho utilizzato in altre parti del programma ed è funzionato benissimo...sinceramente non so quale sia il problema, se qualcuno potesse aiutarmi gliene sarei grato. In seguito inserisco il codice del programma sia server che client.
SERVER
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
#define FLUSH while(getchar()!='\n')
#define N 100
#define STR 50
int cod=100;
struct ogg{
char nome[STR], venditore[STR], offerente[STR];
int base, durata, offerta, codice;
}oggetto[N];
void VisualizzaElementoVend(struct ogg x){
printf("\n--Info oggetto--");
printf("\nNome: %s", x.nome);
printf("\nVenditore: %s", x.venditore);
printf("\nBase d'Asta: %d", x.base);
printf("\n\n--Info offerte--");
printf("\nOfferta Max: %d", x.offerta);
printf("\nOfferente: %s", x.offerente);
}
void VisualizzaElementoAcq(struct ogg x){
printf("\n--Info oggetto--");
printf("\nNome: %s", x.nome);
printf("\n\n--Info offerte--");
printf("\nOfferta Max: %d", x.offerta);
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
int main(){
printf("****** SERVER ******\n");
/*instaurazione collegamento*/
struct sockaddr_in server_addr; /* indirizzo del server */
struct sockaddr_in client_addr; /* indirizzo del client */
int sd_server, sd_client; /* i socket descriptor usati per identificare server e client */
// Creazione socket descriptor per il server.
// AF_INET + SOCK_STREAM --> TCP, utilizzo del protocollo TCP (IPPROTO_TCP)
if((sd_server = socket(AF_INET, SOCK_STREAM, 0)) < 0)
printf("Errore nella creazione del server\n");
/* Inseriamo nella struttura alcune informazioni */
server_addr.sin_family = AF_INET; /* la famiglia dei protocolli */
server_addr.sin_port = htons(1745); /* porta in ascolto */
server_addr.sin_addr.s_addr = INADDR_ANY; /* dato che è un server
bisogna associargli l'indirizzo della macchina su cui sta girando*/
/* Assegnazione del processo alla socket tramite la funzione BIND */
if(bind(sd_server, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
printf("Errore di binding\n");
/* Si mette in ascolto con un massimo di 5 connessioni */
listen (sd_server, 5);
/* Quindi accetterà una sola connessione per volta */
int address_size = sizeof(client_addr); /* dimensione della struttura client_addr */
if((sd_client = accept(sd_server, (struct sockaddr *)&client_addr, & address_size)) < 0)
printf("Errore nella chiamata accept\n");
printf("Connessione accettata!!!\n");
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* ricezione dati dal client */
int i=0, j, req, cod, flag;
while(1){
recv(sd_client,&req,sizeof(int),0);
switch(req){
case 1:
printf("\n\nRichiesta 1 ricevuta!");
recv(sd_client,&oggetto[i],sizeof(oggetto[i]),0);
printf("\nNome: %s", oggetto[i].nome);
printf("\nCodice: %d", oggetto[i].codice);
printf("\nBase d'Asta: %d", oggetto[i].base);
i++;
break;
case 2:
printf("\n\nRichiesta 2 ricevuta!");
recv(sd_client,&cod,sizeof(int),0);
printf("\nCerco l'oggetto con codice: %d",cod);
flag=0;
for(j=0; j<100 && flag==0; j++){
if(cod==oggetto[j].codice) {
flag=1;
send(sd_client,&oggetto[j],sizeof(oggetto[j]),0);
}
}
if(j>=100){
oggetto[j].durata=0;
send(sd_client,&oggetto[j],sizeof(oggetto[j]),0);
}
break;
case 3:
printf("\n\nRichiesta 3 ricevuta!");
int stop=0;
for(j=0; j<100; j++){
if(oggetto[j].durata==0){
stop=1;
send(sd_client,&stop,sizeof(int),0);
}
else{
send(sd_client,&stop,sizeof(int),0);
send(sd_client,&oggetto[j],sizeof(oggetto[j]),0);
}
}
break;
case 4:
printf("\n\nRichiesta 4 ricevuta!");
recv(sd_client,&cod,sizeof(int),0);
flag=0;
int pos=0;
for(j=0; j<100 && flag==0; j++){
if(cod==oggetto[j].codice){
flag=1;
pos=j;
printf("\nNome: %s", oggetto[j].nome);
printf("\nCodice: %d", oggetto[j].codice);
printf("\nBase d'Asta: %d", oggetto[j].base);
}
}
write(sd_client,&oggetto[pos],sizeof(oggetto[pos]));
read(sd_client,&oggetto[pos],sizeof(oggetto[pos]));
printf("\nNome: %s", oggetto[pos].nome);
printf("\nCodice: %d", oggetto[pos].codice);
printf("\nOfferta: %d", oggetto[pos].offerta);
printf("\nBase d'Asta: %d", oggetto[pos].base);
printf("\nVenditore: %s", oggetto[pos].venditore);
/* if(j>=100){
oggetto[j].durata=0;
send(sd_client,&oggetto[j],sizeof(oggetto[j]),0);
}
*/
}
}
}
CLIENT
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
#define FLUSH while(getchar()!='\n')
#define STR 50
int cod=100;
struct ogg{
char nome[STR], venditore[STR], offerente[STR];
int base, durata, offerta, codice;
}oggetto;
void leggi_stringa(char s[], unsigned int dim){
unsigned int i;
for(i=0; (s[i]=getchar())!='\n' && i<dim-1; i++);
s[i]='\0';
if(i==dim-1) while(getchar()!='\n');
}
void LeggiElementoVend(){
printf("\n-----Info Oggetto-----");
fflush(stdout);
printf("\nInserire il nome dell'oggetto: ");
leggi_stringa(oggetto.nome, STR);
fflush(stdout);
printf("Inserire il nome del venditore : ");
leggi_stringa(oggetto.venditore, STR);
fflush(stdout);
printf("Inserire la base di partenza dell'asta: ");
scanf("%d",&oggetto.base);
//FLUSH;
fflush(stdin);
do{
fflush(stdout);
printf("Inserire la durata dell'asta (h - min 24h): ");
scanf("%d",&oggetto.durata);
//FLUSH;
fflush(stdin);
}while(oggetto.durata<=23);
cod++;
oggetto.codice=cod;
fflush(stdout);
printf("\nIl codice dell'oggetto è: %d",oggetto.codice);
}
void VisualizzaElementoVend(){
printf("\n--Info oggetto--");
printf("\nNome: %s", oggetto.nome);
printf("\nVenditore: %s", oggetto.venditore);
printf("\nBase d'Asta: %d", oggetto.base);
printf("\n\n--Info offerte--");
if (oggetto.offerta==0) printf("\nOfferta Max: Nessuna offerta");
else {
printf("\nOfferta Max: %d", oggetto.offerta);
printf("\nOfferente: %s", oggetto.offerente);
}
}
void VisualizzaElementoAcq(){
printf("\n\n++++++++++++--Info oggetto--++++++++++++");
printf("\nNome: %s", oggetto.nome);
printf("\nCodice: %d", oggetto.codice);
printf("\nBase d'Asta: %d", oggetto.base);
printf("\n\n--Info offerte--");
if (oggetto.offerta==0) printf("\nOfferta Max: Nessuna offerta");
else printf("\nOfferta Max: %d", oggetto.offerta);
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
int main(){
printf("****** CLIENT ******\n");
/*instaurazione collegamento*/
int sd; /* Il socket descriptor del client */
struct sockaddr_in server_addr; /* l'indirizzo del server */
/* Utilizzando la struttura hostent si definisce l'indirizzo del server */
struct hostent *hp;
hp = gethostbyname("127.0.0.1");
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(1745);
/* successivamente viene memorizzato nella struttura server_addr */
server_addr.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr)) ->s_addr;
/* Viene creato il socket descriptor */
if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
printf("Errore nella creazione della socket\n");
/* Viene connesso al server */
if(connect(sd, (struct sockaddr *)&server_addr, sizeof(server_addr)) <0)
printf("Errore di connessione al server\n");
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
srand(time(NULL));
int i=0, cod;
int op1, op2, op3, req;
start:
do{
printf("\n\n**Menu'**");
printf("\n1-Venditore");
printf("\n2-Offerente");
printf("\n3-Fine");
printf("\n\nInserisci scelta: ");
scanf("%d", &op1);
FLUSH;
switch(op1){
case 1:
do{
printf("\n\nMenu' Venditore");
printf("\n1-Inserire nuovo oggetto");
printf("\n2-Visualizzare stato oggetto all'asta");
printf("\n3-Tornare indietro");
printf("\n\nInserisci scelta: ");
scanf("%d", &op2);
FLUSH;
switch(op2){
case 1:
req=1;
send(sd,&req,sizeof(int),0);
LeggiElementoVend();
printf("\nnome : %s",oggetto.nome);
send(sd,&oggetto,sizeof(oggetto),0);
break;
case 2:
req=2;
send(sd,&req,sizeof(int),0);
printf("\n-----Info oggetto-----");
printf("\nInserire codice dell'oggetto: ");
scanf("%d",&cod);
send(sd,&cod,sizeof(int),0);
recv(sd,&oggetto,sizeof(oggetto),0);
if(oggetto.durata==0) printf("\nOggetto non trovato!");
else VisualizzaElementoVend();
break;
}
}while(op2<3);
goto start;
case 2:
do{
printf("\n\nMenu' Offerente");
printf("\n1-Visualizzare elenco oggetti all'asta");
printf("\n2-Fare un'offerta");
printf("\n3-Tornare indietro");
printf("\n\nInserisci scelta: ");
scanf("%d", &op3);
FLUSH;
switch(op3){
case 1:
req=3;
send(sd,&req,sizeof(int),0);
int stop=0;
while(stop==0){
recv(sd,&stop,sizeof(int),0);
if(stop==0){
recv(sd,&oggetto,sizeof(oggetto),0);
VisualizzaElementoAcq();
}
}
break;
case 2:
req=4;
send(sd,&req,sizeof(int),0);
printf("\n-----Info oggetto-----");
printf("\nInserire codice dell'oggetto: ");
scanf("%d",&cod);
FLUSH;
write(sd,&cod,sizeof(int));
read(sd,&oggetto,sizeof(oggetto));
//if(oggetto.durata==0) printf("\nOggetto non trovato!");
//else{
//questa è la parte di codice che non funziona. Arrivati a questa visualizzazioni i dati non corrispondono più.
VisualizzaElementoAcq();
printf("\nL'offerta deve essere maggiore all'ultima\nSe non è presente nessuna offerta, l'offerta minima è la base d'asta");
printf("\n\nInserire nome offerente: ");
leggi_stringa(oggetto.offerente,STR);
int off;
do{
printf("\nInserire nuova offerta: ");
scanf("%d",&off);
FLUSH;
}while(off<=oggetto.offerta);
oggetto.offerta=off;
send(sd,&oggetto,sizeof(oggetto),0);
//}
break;
}
}while (op3<3);
goto start;
}
}while(op2<3);
}