Non ho mai fatto davvero la programmazione di rete, quindi questo è tutto nuovo per me. Quello che sto tentando di fare è un client "chat" peer-to-peer. L'idea è che chiunque possa connettersi a qualcuno di cui conoscono l'IP. Tutti i messaggi di chat devono essere distribuiti a tutti.
Quello su cui mi sto bloccando è la scoperta tra pari. Quello che ho fatto finora è:
- L'app ha un IP di una persona conosciuta (utente fornito)
- Si collega all'IP noto
- IP noto fornisce la sua lista di peer noti; lo memorizziamo in
peer list
- Ciclo di scoperta:
- Crea una copia locale di
peer list
- Per ogni peer in
local peer list
- Richiedi elenco peer (ad esempio, passaggio 2 + 3)
- In caso di errore, rimuovi questo peer dall'originale
peer list
- Altrimenti, aggiungi nuovi peer all'originale
peer list
- In caso di errore, rimuovi questo peer dall'originale
- Richiedi elenco peer (ad esempio, passaggio 2 + 3)
- Accoda un altro ciclo di rilevamento in 1 minuto
- Crea una copia locale di
L'ascolto delle connessioni nel passaggio 3 e il ciclo di rilevamento sono asincroni.
Il motivo per cui una copia viene effettuata in primo luogo è dovuta ad alcune altre decisioni di progettazione per il futuro.
Il problema è che se introduco un client con un peer non valido su peer list
, ovvero non puoi collegarti ad esso, ciò che succede è che questo peer viene passato tramite il passaggio 3 quando serve il peer list
noto e allora altri clienti ce l'hanno nel loro. Propagano questo peer cattivo e in seguito, durante il Discover Loop, rimuovono quel peer. Ma poi, faranno un altro ciclo di ricerca e riceveranno di nuovo quel peer da qualcun altro.
Il risultato finale è che il peer cattivo non esce mai dalla rete.
Un'opzione che posso pensare è una vaga idea di avere la "salute" di Peer che ogni cliente tiene traccia di separatamente in modo che possano ignorare i peer forniti su una lista di qualcuno. Tuttavia, penso che questo dovrebbe essere un po '"temporizzato" in modo tale che quando qualcuno si disconnette non viene escluso per sempre dalla rete.
L'altra idea che avevo era di trasmettere un messaggio broadcast a tutti i colleghi conosciuti quando si incontra un peer cattivo. Tuttavia, questa idea non mi è piaciuta perché lascia aperta la possibilità a qualcuno di fare di un altro cliente il compito di avvelenare la rete insistendo sul fatto che i pari sono cattivi. Ciò richiederebbe quindi che i peer controllino che una richiesta di rimozione sia autentica anche tentando di connettersi immediatamente al suo peer.
Sto cercando opinioni sulle due opzioni sopra.