Quiero usar Sockets UDP para mi XNA-Networkgame. Y ahora estoy intentando codificar una Listenerthread confiable, pero hay algunos problemas.C#: Oído de escucha UDP
Si uso socket.Receive esperará hasta que un paquete. Esto está bien para mi Listenerthread. Mi hilo tiene un tiempo de ciclo de esta manera:
while(Listen == true)
{
socket.Receive(...);
}
Pero si intercambiar los Listen-bandera a falso (si quiero dejar de escuchar), será atrapado en el último .Receive().
Luego miré el Methodes .BeginReceive(). Llamará a un método si llegó un paquete. Pero para recibir los datos tengo que usar .EndReceive() y ese es el punto con el que tengo un problema. Quiero seguir escuchando los paquetes y no dejo de escuchar si llega un paquete.
Así que todavía uso la versión de bloqueo con ".Receive()". Pude forzar que el hilo de escucha se cancele al llamar: Thread.abort(), pero esto no es bueno.
Actualmente me prueba si se dispone de datos:
while(Listen == true)
{
if(socket.Available > 0)
{
socket.Receive(...);
}
}
pero creo que esto no es la mejor manera ... Si poco después de la cláusula si un otro hilo está llamando socket.Receive (..) se bloqueará involuntariamente de nuevo. ¿No hay forma de cancelar el método .Receive (..)? He intentado establecer un tiempo de espera, pero si .Recibo tiempo de espera, arrojará una excepción ...
Quiero un hilo udp de escucha simple, puedo parar con gracia. :-) En MSDN no encontré un listener-example que esté escuchando más de un paquete. ¿Cómo manejar otros programadores esto?
"Si poco después de la cláusula si un otro hilo está llamando socket.Receive (..)" - Esto parece implicar que hay múltiples hilos de lectura desde el mismo socket? – Ragoczy
No, no hago eso. Pero es posible y quiero evitar eso :-) – user437899
Cuando esté listo para dejar de escuchar, cierre el socket. El método de bloqueo 'Receive()' saldrá con 'SocketException' que necesitará capturar. –