spina ha scritto:Perché non provi ad utilizzare le fifo in maniera classica, invece di fare questi programmi? Tu mi hai chiesto di non fare commenti ed io non li ho fatti, però se lavori "male" può anche darsi che qualcosa non funzioni.
La teoria vuole che tu la fifo la apri una volta, in lettura da un lato e in scrittura da un altro lato. La connessione rimane in piedi sono a che uno dei due lati non chiude la fifo. Ora, tu nel tuo codice fai aprire sempre la fifo al server ogni volta che ricomincia il ciclo. Ma se il client chiude la fifo prima che il server abbia letto, allora non legge niente, ed ecco perché legge 5 volte su 16.
Tu devi seguire un algoritmo di questo tipo:
- Il server crea la fifo e la apre in lettura
- il client apre la fifo in scrittura
- il client scrive una quantità di dati prefissata in partenza, oppure un messaggio con un intestazione di dimensione fissa in cui il server trova quanto è grande il payload
- il server legge la stessa quantità di dati e la usa i qualche modo
- quando la comunicazione è finita, il client chiude la pipe e il server legge -1.
Se il client manda solo ciao, allora è inutile scrivere un ciclo nel server. Il ciclo dev'essere nella read() e non infinito.
Se vuoi fare un protocollo client-server in cui un server rimane in attesa di connessioni e poi tutti i client si collegano, mandano il "ciao" e poi si scollegano, allora vanno considerate altre questioni. Intanto devi assicurarti che il server abbia letto il messaggio prima di chiudere la fifo, o altrimenti non leggerà niente. Poi devi anche considerare il caso in cui più client si collegano contemporaneamente al server aprendo contemporaneamente la pipe in scrittura.
Lo so che vuoi fare un esempietto stupido per capire come usare le SC, però se l'esempietto non segue il metodo ortodosso con cui usare le fifo è normale che ci saranno problemi.
Emanuele
grazie per il tuo aiuto, avevo chiesto di non fare commenti visto che il codice che avevo scritto era stupido per cui avevo un pò di vergogna, il mio problema era che su alcune macchine mi stampava una volta e su altre due volte, in questo caso su slack

,ma i suggerimenti sono più che accettati in questo momento

.
allora per il ciclo mi occorre perchè non è solo un client a scrivere, ma i client sono un tot., il while è stato implementato con l'idea di costruire successivamente una funzione che dopo un tot. di tempo, all'arrivo di una segnale tipo SIGALRM con la funzione alarm(), e la collaborazione di signal(), il done verrebbe settato a 0 e così uscire dal while, per cui l'idea è questa, il server attende per tot tempo che alcuni client non si sa quanti facciamo un'offerta su un prodotto(implementazione in fase di costruzione), e vince chi offrè di più, poi il server deve elaborare chi ha offerto il massimo ed inviare ai vari client se l'offerta era vincente o perdente, sono partito costruendo passo passo queste parti.
qui, "Tu devi seguire un algoritmo di questo tipo:"
allora alla fine le FIFO sono come le pipe solo che possono essere implementate anche tra processi non imparentati, allora le fifo sono di tipo bloccante una open in lettura e bloccata finchè non c'è una open in scrittura e viceversa, per cui se io non utilizzassi quel ciclo while per la open e la read nel server, non penso che più client potessero scrivere ogni volta, poi le offerte dei vari client vanno memorizzate almeno la prima per poter confrontare di volta in volta l'offerta del client successivo, per cui per la mia realizzazione penso che quel ciclo sia abbastanza utile, poi accetto altre soluzione,.
* Il server crea la fifo e la apre in lettura VIENE CREATA LA FIFO E POI APERTA IN LETTURA FIN QUI PENSO CHE CI SIAMO O SBAGLIO?
* il client apre la fifo in scrittura OK, APRENDO IN SCRITTURA VIENE CHIUSA IN LETTURA DAL LATO SERVER, IL CLIENT SCRIVE "CIAO" E CHIUDE LA FIFO, IL SERVER IN ATTESA APRE IN LETTURA E LEGGE
* il client scrive una quantità di dati prefissata in partenza, oppure un messaggio con un intestazione di dimensione fissa in cui il server trova quanto è grande il payload QUI IL DISCORSO PENSO CHE NON SIA COMPLICATO, O SCRIVE SOLO CIAO O FA ALTRE COSE È DA IMPLEMENTARE IN BASE ALL'ESERCIZIO
* il server legge la stessa quantità di dati e la usa i qualche modo DIPENDE DALL'ESERCIZIO IN QUESTO CASO TUTTI STAMPANO CIAO
* quando la comunicazione è finita, il client chiude la pipe e il server legge -1. DOPO LA WRITE HO LA CLOSE DI FDS.
alla fine non riesco a rendermi conto se sbaglio o no, se potresti farmi un esempio da farmi capire, ho letto la teoria e penso che qualcosa l'ho capita e sembra che il discorso fili.
