Newsgroup: it.comp.os.linux.development
Titolo: problema client-server

Ciao a tutti,
ho un piccolo problema con un programma.
Sto cercando di realizzare un "cat" da un client verso un server, 
mantenendo la connessione aperta anche dopo il trasferimento dei dati.
Se non chiudo la connessione con close(sd), non rieco ad uscire dal read 
del client, che aspetta dei dati oppure uno "0".
Soltanto la chiusura della connessione da parte del server mi 
restituisce "0" e il client esce dal read.
E' possibile aggirare il problema, inviano al client un EOF senza 
chiudere la connessione?
Server:
....
	while(1)
	{
		bytes = read(fd, buf, BUF_SIZE);	/* legge dal file */
 
		if(bytes <= 0)		/* controlla la fine del file */
			break;
		write(sd, buf, bytes);	/* scrive sul socket */
	}
	close(fd);			/* chiude file */
	close(sd);			/* chiude connessione */
....
Client:
....
	while(1)
	{
		bytes = read(sd, buf, BUF_SIZE);	/* legge dal socket */
 
		if((bytes <= 0))	/* controlla la fine del file */
			break;		/* esce dal loop */
 
	write(1, buf, bytes);		/* scrive sullo standard output */
	}
....
Grazie,
ciao.

 restituisce "0" e il client esce dal read.
A Meno di non inventare un protocollo apposito tra client e server che
preveda una sequenza dati a simboleggiare EOF e una per mascherarla quando
invece casualmente fa parte dei dati, l' unica cosa che mi viene in
mente e' l' uso dei dati fuori banda.
Questo comunque implica la modifica del client e del server, quindi non
potresti comunque mettere al posto del client una generica applicazione.
Lato server dovresti sostituire la write con send e quando vuoi trasmettere
EOF setti il flag MSG_OOB e lato client anziche' read usi select() per
testare la disponibilita' di dati da leggere o la presenza di dati fuori
banda. E' come avere una sessione TCP di controllo in parallelo, ma
con il vantaggio di essere sincronizzata, cioe' non succedera' che i dati
fuori banda "sorpassino" i dati veri e propri. Attenzione pero'! non so se'
e' veramene un buon consiglio: tutto divente forse inutilmente complicato,
lato client dovresti settare l' opzione per ricevere i dati fuori banda
in linea con i dati correnti (SO_OOBLINE), ma poi dovresti con ioctl()
trovare quale posizione dei dati OOB nel flusso dati normale per poterli
eliminare. Se i dati OOB non sono ricevuti in linea E' AMMESSO CHE POSSANO
ESSERE PERDUTI (Stevens) nel caso il processo consumatore non sia veloce
a leggerli.
Io francamente preferirei la prima tecnica, quella dell' apposito
protocollo
sia perche' i dati fuori banda sono poco usati sia perche' in altri stack
di protocolli potrebbero non essere previsti. SMTP ad esempio usa
la sequenza <CR><LF>.<CR><LF> per indicare che il body della e-mail e'
terminato e ci si ritrova a poter mandare un' altra e-mail senza aprire
altra sessione TCP. Tutte le linee nel corpo del messaggio che
iniziano con . vengono replicate con la stessa linea con un punto in piu'
che il server ricevente rimuovera'.
Spero di essere stato di aiuto.
Ciao
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


Dire che la tua risposta va ben oltre alle mie aspettative.
Credo che sceglierň la soluzione del protocollo, vediamo...
Grazie,
ciao,
biofa.

 chiudere la connessione?
prova con la select()
--> man 2 select
oppure aprendo il socket e leggendo in modalità asincrona (questo non 
l'ho mai fatto)
--> man 7 socket (cerca FIOASYNC)
-- 
Bio_82 ---  bio(underscore)82(underscore)mail(minus)nntp(at)yahoo(dot)it