Voglio utilizzare UDP-Sockets per il mio XNA-Networkgame. E ora sto cercando di codificare un Listenerthread affidabile, ma ci sono alcuni problemi.C#: Listener UDP Thread
Se utilizzo socket. Ricevuto, aspetterà un pacchetto. Questo va bene per il mio Listenerthread. mio thread ha un ciclo while in questo modo:
while(Listen == true)
{
socket.Receive(...);
}
Ma se io scambiare la Listen-Flag a false (se voglio smettere di ascoltare), sarà attaccato nell'ultima .Receive().
Poi ho esaminato i metodi .BeginReceive(). Chiamerà un metodo se un pacchetto è arrivato. Ma per ricevere i dati devo usare .EndReceive() e questo è il punto in cui ho un problema. Voglio ancora ascoltare i pacchetti e non smettere di ascoltare se arriva un pacchetto.
Quindi uso ancora la versione di blocco con ".Receive()". Potrei forzare l'ascolto del thread per cancellare chiamando: Thread.abort(), ma questo non va bene.
Attualmente mi testare se i dati sono disponibili:
while(Listen == true)
{
if(socket.Available > 0)
{
socket.Receive(...);
}
}
ma credo che questo non è il modo migliore ... Se poco dopo il caso-clausola di un altro thread sta chiamando socket.Receive (..) rimarrà di nuovo non intenzionale. Non c'è modo di annullare il metodo .Receive (..)? Ho provato a impostare un timeout, ma se .Ricevi timeout, verrà generata un'eccezione ...
Voglio un semplice thread di ascolto udp, posso fermarmi con garbo. :-) In MSDN non ho trovato un esempio listener che stia ascoltando più di un pacchetto. Come gestire questo programmatore?
"Se poco dopo il caso-clausola di un altro thread sta chiamando socket.Receive (..)" - questo sembra implicare che ci sono più thread di lettura dalla stessa presa di corrente? – Ragoczy
No, non lo faccio. Ma è possibile e voglio evitarlo :-) – user437899
Quando sei pronto per interrompere l'ascolto, chiudi il socket. Il metodo di blocco 'Receive()' uscirà con una 'SocketException' che dovrai catturare. –