2009-07-20 14 views
0

マルチキャストメッセージをリッスンしているudpクライアントがあります。メッセージを取得すると、メッセージが解析され、クライアントはリスニングを再開します。 socket.ReceiveFromメソッドがブロックされている間にアプリケーションがシャットダウンした場合は、このプロセスを中断して続行するにはどうすればよいですか?どのようにsocket.ReceiveFromコールを中断しますか?

私は別のスレッドで実行されているソケットを持っているし、そのスレッドへの割り込みを発行しようとしたが、割り込みが動作しませんsocket.ReceiveFromはメッセージを取得しない限り戻りません。

私もソケットでタイムアウトを設定しようとしましたが、これはタイムアウト時に例外を生成するので理想的ではありません。私は常にリッスンしていますので、タイムアウトを生成し、聞くことに。

私はここで何を試すことができますか?

答えて

1

が見つかりました。スレッドがブロックされている外でソケットを利用できるようにし、socket.Closeを呼び出すことができます。これにより、SocketExceptionが中断されてスローされます。まだ少し汚れているようですが、それは仕事を完了します。

誰か良い方法がありますか?

+0

ソケットをプライベートメンバーとして持つクラスとしてスレッドを実装します。 Socket.Closeを行う公開の 'Shutdown'メソッドを追加してください。あきらめたいと思ったら、外から電話してください。カプセル化と呼ばれています。 –

+0

それは私がやったことです。それはちょうどそのような別のスレッドからソケット上のクローズを呼び出すためにきれいに見えません。しかし、それは動作します。 – Kelly

0

私はソケットエキスパートではありませんが、まだ試してみることができます。

次の2つの組み合わせを使用して、非ブロッキングソケットを作成します。

1)特定のソケットで待機するには、タイムアウトのselect関数を使用します。タイムアウト後、まだそのソケットを待つかどうかを確認してください。

2)あなたはO_NONBLOCKを使ってrecvfrom call non-blockingにしてください。 http://www.kegel.com/dkftpbench/nonblocking.html

上記のリンクを使用して、recvfrom non-blockingを作成する方法を検討してください。

Google for select。

関連する問題