🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: alt.pl.comp.lang.csharp
6 messages
6 total messages Started by yamma Sat, 08 Jan 2011 14:17
TcpListener, jak zatrzymać
#21974
Author: yamma
Date: Sat, 08 Jan 2011 14:17
9 lines
1452 bytes
Męczę się już z tym parę dni i nawet guglanie nie pomaga. Mam TcpListenera, 
który nasłuchuje na jakimś tam porcie. On sobie chodzi w osobnym wątku. 
Wszystko pięknie bangla, odpowiada na połączenia, tworzy nowe sockety, itd. 
Problem pojawia się gdy chcę zakończyć pracę tego TcpListenera. Jak to 
zrobić? Z poziomu jego wątku nie mogę tego zrobić bo blokuje tenże wątek na 
metodzie AcceptTcpClient, natomiast jeśli próbuję wywołać metodę Stop z 
innego wątku to aplikacja się wywala z błędem "Operacja blokująca została 
przerwana przez wywołanie funkcji WSACancelBlockingCall".
yamma 
Re: TcpListener, jak zatrzymać
#21975
Author: 3P
Date: Sat, 08 Jan 2011 18:38
21 lines
2014 bytes
Dnia 08-01-2011 o 15:17:05 yamma <yamma@wp.pl> napisał(a):

> Męczę się już z tym parę dni i nawet guglanie nie pomaga. Mam  
> TcpListenera, który nasłuchuje na jakimś tam porcie. On sobie chodzi w  
> osobnym wątku. Wszystko pięknie bangla, odpowiada na połączenia, tworzy  
> nowe sockety, itd. Problem pojawia się gdy chcę zakończyć pracę tego  
> TcpListenera. Jak to zrobić? Z poziomu jego wątku nie mogę tego zrobić  
> bo blokuje tenże wątek na metodzie AcceptTcpClient, natomiast jeśli  
> próbuję wywołać metodę Stop z innego wątku to aplikacja się wywala z  
> błędem "Operacja blokująca została przerwana przez wywołanie funkcji  
> WSACancelBlockingCall".
> yamma

Nigdy sam z tego nie korzystałem, ale czy pierwsze dwa linki z google'a ci  
nie pomogą?

http://stackoverflow.com/questions/365370/proper-way-to-stop-tcplistener
http://stackoverflow.com/questions/31871/wsacancelblockingcall-exception

-- 
3P
Re: TcpListener, jak zatrzymać
#21976
Author: yamma
Date: Sat, 08 Jan 2011 23:01
29 lines
2519 bytes
3P wrote:
> Dnia 08-01-2011 o 15:17:05 yamma <yamma@wp.pl> napisał(a):
>
>> Męczę się już z tym parę dni i nawet guglanie nie pomaga. Mam
>> TcpListenera, który nasłuchuje na jakimś tam porcie. On sobie chodzi
>> w osobnym wątku. Wszystko pięknie bangla, odpowiada na połączenia,
>> tworzy nowe sockety, itd. Problem pojawia się gdy chcę zakończyć
>> pracę tego TcpListenera. Jak to zrobić? Z poziomu jego wątku nie
>> mogę tego zrobić bo blokuje tenże wątek na metodzie AcceptTcpClient,
>> natomiast jeśli próbuję wywołać metodę Stop z innego wątku to
>> aplikacja się wywala z błędem "Operacja blokująca została przerwana
>> przez wywołanie funkcji WSACancelBlockingCall".
>> yamma
>
> Nigdy sam z tego nie korzystałem, ale czy pierwsze dwa linki z
> google'a ci nie pomogą?
>
> http://stackoverflow.com/questions/365370/proper-way-to-stop-tcplistener
> http://stackoverflow.com/questions/31871/wsacancelblockingcall-exception

Tak, czytałem to. Po mojemu, metoda AcceptTcpClient powinna uzyskać status 
deprecated bo jedynym sposobem zamknięcia jest zabicie wątku. A 5 
przykazanie mówi wyraźnie "Nie zabijaj". :-) Jedyne rozwiązanie to 
BeginAcceptTcpClient z callbackiem. Generalnie z socketami w .NET jest 
niezła jazda. Np. próba połaczenia się z nieistniejącym adresem/portem 
powoduje wywalenie wyjątku co jest dla mnie kompletnie niezrozumiałe bo to 
nie jest żadne wyjątkowe zachowanie. Konieczność obsługi takiego wyjątku 
kompletnie rozpieprza całą koncepcję i logikę aplikacji.
yamma 
Re: TcpListener, jak zatrzymać
#21977
Author: Teodor
Date: Mon, 10 Jan 2011 10:21
44 lines
2810 bytes
Użytkownik "yamma" <yamma@wp.pl> napisał w wiadomości 
news:igaqct$7eq$1@inews.gazeta.pl...
> 3P wrote:
>> Dnia 08-01-2011 o 15:17:05 yamma <yamma@wp.pl> napisał(a):
>>
>>> Męczę się już z tym parę dni i nawet guglanie nie pomaga. Mam
>>> TcpListenera, który nasłuchuje na jakimś tam porcie. On sobie chodzi
>>> w osobnym wątku. Wszystko pięknie bangla, odpowiada na połączenia,
>>> tworzy nowe sockety, itd. Problem pojawia się gdy chcę zakończyć
>>> pracę tego TcpListenera. Jak to zrobić? Z poziomu jego wątku nie
>>> mogę tego zrobić bo blokuje tenże wątek na metodzie AcceptTcpClient,
>>> natomiast jeśli próbuję wywołać metodę Stop z innego wątku to
>>> aplikacja się wywala z błędem "Operacja blokująca została przerwana
>>> przez wywołanie funkcji WSACancelBlockingCall".
>>> yamma
>>
>> Nigdy sam z tego nie korzystałem, ale czy pierwsze dwa linki z
>> google'a ci nie pomogą?
>>
>> http://stackoverflow.com/questions/365370/proper-way-to-stop-tcplistener
>> http://stackoverflow.com/questions/31871/wsacancelblockingcall-exception
>
> Tak, czytałem to. Po mojemu, metoda AcceptTcpClient powinna uzyskać status 
> deprecated bo jedynym sposobem zamknięcia jest zabicie wątku. A 5 
> przykazanie mówi wyraźnie "Nie zabijaj". :-) Jedyne rozwiązanie to 
> BeginAcceptTcpClient z callbackiem. Generalnie z socketami w .NET jest 
> niezła jazda. Np. próba połaczenia się z nieistniejącym adresem/portem 
> powoduje wywalenie wyjątku co jest dla mnie kompletnie niezrozumiałe bo to 
> nie jest żadne wyjątkowe zachowanie. Konieczność obsługi takiego wyjątku 
> kompletnie rozpieprza całą koncepcję i logikę aplikacji.
> yamma

Wywala wątek nawet wtedy gdy masz
try
{
}
catch (Exception ex)
{
}

?

----
ts 
Re: TcpListener, jak zatrzymać
#21978
Author: yamma
Date: Mon, 10 Jan 2011 12:12
26 lines
1903 bytes
Teodor wrote:
> Użytkownik "yamma" <yamma@wp.pl> napisał w wiadomości
> news:igaqct$7eq$1@inews.gazeta.pl...

>> Tak, czytałem to. Po mojemu, metoda AcceptTcpClient powinna uzyskać
>> status deprecated bo jedynym sposobem zamknięcia jest zabicie wątku.
>> A 5 przykazanie mówi wyraźnie "Nie zabijaj". :-) Jedyne rozwiązanie
>> to BeginAcceptTcpClient z callbackiem. Generalnie z socketami w .NET
>> jest niezła jazda. Np. próba połaczenia się z nieistniejącym
>> adresem/portem powoduje wywalenie wyjątku co jest dla mnie
>> kompletnie niezrozumiałe bo to nie jest żadne wyjątkowe zachowanie.
>> Konieczność obsługi takiego wyjątku kompletnie rozpieprza całą
>> koncepcję i logikę aplikacji. yamma
>
> Wywala wątek nawet wtedy gdy masz
> try
> {
> }
> catch (Exception ex)
> {
> }
>
> ?

Dziwne pytanie. A jak myślisz, po co jest blok try - catch?
yamma 
Re: TcpListener, jak zatrzymać
#21979
Author: yamma
Date: Mon, 10 Jan 2011 13:18
26 lines
2555 bytes
yamma wrote:
> Męczę się już z tym parę dni i nawet guglanie nie pomaga. Mam
> TcpListenera, który nasłuchuje na jakimś tam porcie. On sobie chodzi
> w osobnym wątku. Wszystko pięknie bangla, odpowiada na połączenia,
> tworzy nowe sockety, itd. Problem pojawia się gdy chcę zakończyć
> pracę tego TcpListenera. Jak to zrobić? Z poziomu jego wątku nie mogę
> tego zrobić bo blokuje tenże wątek na metodzie AcceptTcpClient,
> natomiast jeśli próbuję wywołać metodę Stop z innego wątku to
> aplikacja się wywala z błędem "Operacja blokująca została przerwana
> przez wywołanie funkcji WSACancelBlockingCall".

Ok. Po dłuższym śledztwie wykoncypowałem dwa rozwiązania. Przede wszystkim, 
przyczyną takiego zachowania jest próba zamknięcia z innego wątku niż ten, w 
którym chodzi TcpListener. Jak łatwo się domyślić, tradycyjnie, przykłady z 
dokumentacji MSDN dotyczące TcpListenera można o kant dupy potłuc. W sieci 
jest mnóstwo pytań o to. Ludzie spod znaku MVP, którzy wypowiadają się 
chętnie w innych tematach, w tym akurat raczej milczą i jeśli ktoś się chce 
czegoś dowiedzieć w tym temacie to raczej się nie dowie.
Pierwsze rozwiązanie, to wywołanie metody Stop() i ordynarne przechwycenie 
wyjątku. Choć to rozwiązanie dla mnie jest ryzykowne, bo gość, który je 
podał nie miał żadnego TTSa przy nazwisku.
Drugie rozwiązanie, to zwykłe otwarcie nowego połączenia z TcpListenerem z 
poziomu wątku głownego co spowoduje wyjście z metody AcceptTcpClient() a o 
to nam chodzi.
yamma
PS. TTS - Tajemniczy Trzyliterowy Skrót 
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads