Newsgroup: it.comp.os.linux.development
Titolo: Programmazione con socket ... aiuto

Premetto che credo forse questo è il ng sbagliato ....
ma sono certo che qualcuno di voi mi saprà aiutare ...
GRAZIE !!!
Ciao,
ho in scritto in C due piccoli processi uno client e l'altro server
(TCP/IP).
Lancio il client sul PC1 e il server sul PC2.
Mi accade questo
Il Client si collega ...
invia una sequenza di caratteri ....
il server li riceve, aspetta T secondi (sleep(T)) e poi fa una write sulla
stessa connessione.
client --> tutto va a buon fine, i caratteri inviati dal server arrivano e
tutto è OK.
Se spengo il PC1 prima della fine dei T secondi, il server si risveglia, fa
la write e ho un
bellissimo "segmentation fault".
Ovviamente se il PC1 non viene spento (o il client killato) tutto va a boun
fine
Ora mi chiedo ... come posso accorgermi che la socket alzata dal client è
crollata ?
Infatti, per evitare che il server vada in crash vorrei fare così:
controllare che la socket sia ancora attiva prima di scrivere...
Ha senso quello che ho notato ?
Sbaglio qualcosa ?
Come si risolvono questi problemi normalmente ?
Ciao e grazie a tutti per l'aiuto !

 GRAZIE !!!
Ciao,
ho in scritto in C due piccoli processi uno client e l'altro server
(TCP/IP).
Lancio il client sul PC1 e il server sul PC2.
Mi accade questo.
Il Client si collega ...
invia una sequenza di caratteri ....
il server li riceve, aspetta T secondi (sleep(T)) e poi fa una write sulla
stessa connessione.
Se spengo il PC1 prima della fine dei T secondi, il server quando si
risveglia, fa
la write e ha un bellissimo "segmentation fault".
Ovviamente se il PC1 non viene spento (o il client killato) tutto va a buon
fine
Ora mi chiedo ... come posso accorgermi che la socket alzata dal client è
crollata ?
Infatti, per evitare che il server vada in crash vorrei
controllare che la socket sia ancora attiva prima di scrivere...
Ha senso quello che ho notato e la soluzione che propongo ?
Sbaglio qualcosa ?
Come si risolvono questi problemi normalmente ?
Ciao e grazie a tutti per l'aiuto !
EV

 EV
Matic
_________________________________________
..in a world far away we may meet again..

 
Mi risulta un' altra cosa: sia send() che write() applicata a socket
possono ritornare un valore minore della dimensione del buffer
trasmesso e anche 0 e cio' non e' considerato errore. Succede se
ad esempio il remoto non conferma la window TCP/IP. R.Stevens stesso
riporta un esempio di funzione TRASMETTI(sd,buff,n) che itera
chiamare a send fino a che tutti i caratteri sono stramessi o fino
al verificarsi di un errore (ritorno di valore negativo) Un valore
negativo puo' essere la chiusura per irraggiungibilita' del remoto.
(lo si scopre ispezionando errno).
Comunque c' e' una lettura di DJB che mi sta angustiando:
http://cr.yp.to/docs/connect.html
pare che qualunque tecnica si usi ha delle controindicazioni, magari
come portabilita' (es: Solaris fa quello che gli pare)
Ciao
Roberto

 (TCP/IP).
Il problema non puo' essere la chiusura del peer remoto perche'
write o send devono solo ritornare un valore negativo. Anche io
ho scritto un echo-server ispirato a quello sullo Stevens e l' ho
sottoposto a tutte le sevizie possibili (quelle che mi sono venute
in mente)
Senza vedere il codice non e' possibile dire cosa puo essere, magari
qualche altra linea di codice.
Il tuo server forka ??? (fork()) Per read e write usi il descrittore
ritornato da accept() o quello in listen() ?? (deve essere quello
ritornato da accept())
sei sicuro che in nessun caso superi i limiti del buffer con
qualche indirizzamento?
Vedere codice please!!
ciao
Roberto

 ha scritto nel messaggio
news:pan.2002.09.01.02...@hotmail.com...
