PDA

View Full Version : [C] Socket


Ardin Rayod
17-02-2010, 15:13
Salve a tutti, ho un piccolo problema con i socket(). Ho sviluppato una semplice applicazione client-server. Il tutto funziona correttamente ma se uno dei due processi termina non correttamente (crash) l'altro entra in un loop infinito sulla funzione di ricezione dal socket. Come funzioni utilizzo le send() e recv() e sviluppo in ambiente UNIX. Quale potrebbe essere il problema di queste letture "fasulle" anche se dall'altra parte il socket è morto? Come posso ovviare a questa cosa accorgendomi che l'altro lato è crashato?

Per ogni dubbio o delucidazione sono a vostra disposizione.

Grazie tante :)

nuovoUtente86
17-02-2010, 15:45
dovresti settare un timeout.

Ardin Rayod
17-02-2010, 15:55
Scusa, ma con il timeout cosa risolverei .. non è che il processo mi si blocca sulla recv all'infinito .. è che mi inizia a ricevere un sacco di "0" che invece nessuno ha mai inviato perché l'altro processo è crashato. Spiegati meglio forse non ho inteso bene cosa volevi dirmi.

nuovoUtente86
17-02-2010, 16:05
se posti il codice è meglio. In ogni caso il timeout serve a resettare la connessione qualora l' altra entità sia chrashata.

clockover
17-02-2010, 18:49
se non mi sbaglio devi gestire il segnale di SIGPIPE
http://www.cs.pitt.edu/~alanjawi/cs449/code/shell/UnixSignals.htm

Ardin Rayod
17-02-2010, 21:59
Grazie, appena posso vi posto il codice dello spezzone di programma. Ho anche un secondo problema che mi torna assai strano. Supponiamo che il server invii 5 byte sul socket ed il client esegua una recv() leggendo i primi 4 byte. Adesso il server chiude la connessione ed il client successivamente vuole leggere l'ultimo byte spedito dal server. In questo caso non leggo il byte ma ricevo un messaggio di errore (viene settata la variabile errno) e non posso leggere il byte che mi manca. Questi comportamenti li trovo molto strani perché non mi sembrava che i socket si comportassero in questo modo. Vedo di postare il codice domani mattina .. se qualcuno cmq ha esperienza di programmazione su socket accetto ogni consiglio.

Saluti :)