Questo dovrebbe essere molto facile da implementare come parte del controllo keep-alive. A meno che tu non stia ignorando completamente il problema delle connessioni interrotte, probabilmente hai un sistema keep-alive che invia periodicamente un messaggio client-> server e viceversa se non c'è stata comunicazione. Dovrebbe essere banale aggiungere un semplice valore "ultimo tempo di ricezione dati" allo stato del socket, quindi chiudere il socket se si allontana troppo da DateTime.Now
.
Ma la domanda più importante è "Perché?". La soluzione migliore dipende da quali sono le tue ragioni in primo luogo. Vuoi rendere il server utilizzabile per più clienti scaricando quelli che non inviano dati? Probabilmente peggiorerai tutto, dal momento che i timeout per i socket TCP sono più di 2-4 minuti, quindi quando si disconnette il client dopo 20 secondi e si ricollega, ora utilizzerà due porte sul lato server, anziché una. Ops.
Come per il commento sulla risposta cancellata, and connection without data send and receive i think it gonna waste your threads
punti più vicini al tuo vero problema: la quantità di connessione che il tuo server non dovrebbe avere alcuna relazione con il numero di thread che il server usa per servire quelle connessioni. Quindi l'unica cosa che una connessione aperta potrebbe "sprecare" è fondamentalmente un po 'di memoria (a seconda della quantità di memoria necessaria per la connessione, più il costo del socket con i suoi buffer) e una porta TCP. Questo può essere un problema in alcune applicazioni, ma se arrivi mai a quel livello di "caricamento", probabilmente puoi già congratularti con te stesso. Molto più probabilmente finirai con altre risorse prima di avvicinarti ai limiti delle porte (supposizione basata sul fatto che sembra che stai realizzando un gioco MMO). Se ti imbatti davvero in problemi con questi, probabilmente vuoi rilasciare TCP e riscrivere tutto in UDP (o preferibilmente, una soluzione pronta su UDP).
Che dire di un timer che controlla periodicamente tutti i client attivi. È necessario aggiornare l'ultimo tempo di ricezione per client, quando i dati vengono ricevuti e garantire una sincronizzazione corretta. –
@AlexFarber forse. ttl funziona per questo? come posso usarlo per questo? – virtouso
@AlexFarber per favore inviami il tuo codice di esempio. grazie – virtouso