none
Winsockのaccept関数で待機中のスレッドを安全に終了させるには? RRS feed

  • 質問

  • こんにちは。
    いつもお世話になっております。

    Windows 7 Enterprise(x64) + VS2010 Professionalの環境下で、SDKで開発を行っております。

    今回、Winsock2プログラミングに初挑戦なのですが、メインスレッドとは別にaccept関数で、待機しているスレッド(終了のフラグが立つまでパケット受信後も再度待機状態になるようなループのスレッド)を立てているアプリケーションで、設定の変更やアプリケーションの終了時に、このスレッドを安全に停止する方法がわからず困っております。

    accept関数を実行すると、クライアント側からパケットを受信するまで待機状態になりますよね?
    そうすると、TerminateThreadでスレッドを強制的に停止させないと、そのスレッドは停止できなくなってしまいませんか?

    一般的なアプリケーションはこのような場合どのように安全にスレッドを停止させているのでしょうか?

    またこのようにスレッド内でクライアントからのTCPパケットの受信を待機⇒受信後必要な処理をしたら再度待機⇒終了フラグでループを抜けてスレッドを終了、という動きをさせるときには、accept関数以外のものを利用するのでしょうか?

    不勉強で申し訳ありませんが、何かヒントや参考になるサイトなどでも結構ですので、ご教授いただけないでしょうか?

    よろしくお願いいたします。

    2011年1月21日 19:28

回答

  • UNIXでも使われている環境依存の少ない一般的な方法ですと、accept()する前にselect() してaccpt()可能な状態かを調べますが。

    Winsock特有の方法としてはAcceptEx() を使うのでしょうか。IO完了ポートとかいろいろ複雑な部分に足を踏み入れていく必要がありますが。私もよくわかってないです。

    • 回答としてマーク どらちん 2011年1月24日 14:36
    2011年1月21日 23:52

すべての返信

  • UNIXでも使われている環境依存の少ない一般的な方法ですと、accept()する前にselect() してaccpt()可能な状態かを調べますが。

    Winsock特有の方法としてはAcceptEx() を使うのでしょうか。IO完了ポートとかいろいろ複雑な部分に足を踏み入れていく必要がありますが。私もよくわかってないです。

    • 回答としてマーク どらちん 2011年1月24日 14:36
    2011年1月21日 23:52
  • 佐祐理さん

    レスありがとうございます。
    select関数から、いろいろ検索し、WSAEventSelect関数にたどり着き、無事実装できました!!

    貴重なヒントをありがとうございます!!

    2011年1月24日 14:38