ciao,
premetto che ho guardato solo la parte del tuo codice che riguarda il listener, il client no.
Senza scendere nel merito di come vengono processate le richieste di un nuovo client, ho notato due errori di fondo:
fai lo start e lo stop del listener all'interno del ciclo e non ha senso, anche perché così se si connettono due client contemporaneamente il primo che esce butta fuori anche l'altro.
start va prima e stop ovviamente dopo il ciclo.
nel ciclo infinito che usi per accogliere nuovi client non vedo un modo per uscire, ciò significa che per interrompere l'ascolto devi far crashare l'applicazione altrimenti il thread resta attivo e il processo non muore.
il costruttore TcpListener che accetta in ingresso solo la porta è obsoleto (vedi documentazione msdn), meglio usare quello che accetta in ingresso anche l'ipAddress.
![]()