Oppure

Loading
18/01/15 22:57
Roby94
Buonasera.
Solitamente quando adopero socket TCP non ho mai necessità di avere un aggiornamento in real time dello stato della connessione, ora però mi trovo ad avere un UI che per rimanerne operativa deve sapere che la connessione con il server "funzioni". Ho sempre verificato la connessione in fase di invio mediante verifica del ACK ricevuto, ora però avrei bisogno di un aggiornamento con un con periodo fisso; ogni 500ms potrebbe andare. Avevo pensato di implementare nel UI un thread che inviasse periodicamente un byte che il server scartasse una volta ricevuto. Data questa procedura un dubbio mi assale, l'UI parallelamente al thread di controllo può inviare una matrice di 4 byte, dove il primo non è mai uguale al byte di verifica, il server ricevuto questo byte si attende i restanti 3 byte che pero non è garantito che siano diversi dal byte di verifica, quindi se per caso UI inviasse il carattere di controllo durante una comunicazione causerebbe un disallineamento del segnale visto che il server potrebbe interpretare il byte di verifica come uno dei 3 byte di dati.

Ho letto che si può richiedere uno stato della connessione adoperando il metodo pool della classe Socket ma non riesco a capirne il funzionamento e come questo possa verificare la connessione senza inviare dei dati come potrei inviarli io con il byte di verifica.

Qualcuno mi potrebbe spiegare una soluzione corretta per evitare spiacevoli inconvenienti?

Grazie.
aaa
19/01/15 8:19
HeDo
Tutte le problematiche che poni sono superflue, in quanto è lo stesso protocollo TCP che te le garantisce it.wikipedia.org/wiki/…

Dal momento che la connessione è TCP/IP non preoccuparti di null'altro che trasferire dati!
aaa
19/01/15 8:54
Ma a cosa ti serve tutta questa storia? Perché ti poni tutte queste domande?

Tu devi solamente inviare e ricevere dati e, ovviamente, trattare gli eventuali errori.

Possono esserci mille motivi per cui una comunicazione non va a buon fine e possono intervenire un millisecondo dopo che tu hai fatto il controllo di cui parli. Quindi il controllo è assolutamente inutile.
19/01/15 13:14
Roby94
Quindi in poche parole quando richiamo il metodo Write è impossibile che si sovrapponga e vada a confondersi con un con altra istanza.
Cavolo adesso che ci penso è molto sensata la cosa, consideravo i 4 byte come separati ma in effetti finiscono nello stesso pacchetto e TCP tiene conto dell'ordine dei pacchetti, quindi è impossibile che il byte di controllo finisca in mezzo ad una serie di byte.
Grazie, ho fatto il tremendo errore di confondere il TCP con un semplice bus di basso livello.
Ma scusate la scelta del byte singolo è sensata per la verifica della connessione?
aaa
19/01/15 13:24
Non ci siamo capiti ...

Non devi testare la connessione. Devi solo inviare e ricevere i tuoi dati (e controllare eventuali errori durante queste fasi).
19/01/15 13:31
Roby94
Postato originariamente da nessuno:

Non ci siamo capiti ...

Sono d'accordo, ma è una necessita esclusivamente mia questo controllo, poiché voglio poter gestire le chiusure non controllate. Quando il server chiude la connessione invia un pacchetto che mi dice non siamo piu connessi, ma voglio poter gestire anche in caso il server si arresti in maniera anomala oppure venga escluso dalla rete o situazioni che comunque non contemplino l'invio del pacchetto di fine connessione, capito?
aaa
19/01/15 13:40
Io ho capito che vuoi fare, ma tu non hai capito che ti ho detto che è un approccio sbagliato.

Tutto quello che devi fare, come ti dicevo, è

-apri la connessione

-ricevi/invia dati

-controlla gli errori durante la ricezione/invio

-chiudi la connessione
19/01/15 13:42
HeDo
Basta gestire gli eventi di errore, fa tutto TCP :)
aaa