Chcę używać UDP-Sockets dla mojej XNA-Networkgame. A teraz próbuję kodować niezawodny Listenerthread, ale są pewne problemy.C#: UDP Listener Thread
Jeśli użyję socket.Receive będzie czekać do pakietu. To jest dobre dla mojego Listenerthread. Mój wątek ma chwilę pętli tak:
while(Listen == true)
{
socket.Receive(...);
}
Ale gdybym zamienić listen-Flag na false (jeśli chcę przestać słuchać), będzie on zatrzymany w ostatnim .Receive().
Potem przyjrzałem się Methodes .BeginReceive(). Wywoła metode, jeśli nadejdzie pakiet. Ale aby otrzymać dane, które muszę użyć .EndReceive() i to jest punkt, z którym mam problem. Chcę nadal słuchać pakietów i nie przestawać nasłuchiwać, jeśli nadejdzie pakiet.
Nadal używam wersji blokującej z ".Receive()". Mogłem wymusić anulowanie wątku odsłuchowego przez wywołanie: Thread.abort(), ale nie jest to dobre.
Obecnie sprawdzić, czy dane są dostępne:
while(Listen == true)
{
if(socket.Available > 0)
{
socket.Receive(...);
}
}
Ale myślę, że to nie jest najlepszy sposób ... Jeśli wkrótce po IF-klauzuli inny wątek dzwoniącej socket.Receive (..) znowu utknie w nieumyślnym. Czy nie ma możliwości anulowania metody .Receive (..)? Próbowałem ustawić limit czasu, ale jeśli .Receive timeout, to wyrzuci wyjątek ...
Chcę prostego wątku słuchania, mogę zatrzymać się z wdziękiem. :-) W MSDN nie znalazłem listenera - przykład, który nasłuchuje więcej niż jednego pakietu. Jak obsługiwać to inne programistę?
„Jeśli zaraz po IF-klauzuli inny wątek dzwoni socket.Receive (..)” - to wydaje się sugerować, że istnieje wiele wątków odczytu z tego samego gniazda? – Ragoczy
Nie, nie robię tego. Ale jest to możliwe i chcę tego uniknąć :-) – user437899
Gdy jesteś gotowy, aby przestać słuchać, zamknij gniazdo. Metoda blokująca 'Receive()' zakończy działanie z 'SocketException', który musisz przechwycić. –