2012-03-10 14 views
0

Windowsソケット "connect"関数の呼び出しを中断することが可能かどうか疑問に思っていましたか?接続ウィンドウwsaソケットを中断

問題は、私のコードでは別のスレッドで実行する必要があるということです(GUIスレッドが実行され続けるため)。しかし、プログラムが閉じられると、WSAETIMEDOUT例外のためにwatingしているスレッドが "connect"を呼び出しています。

アイデア?

更新/ヒント:私はconnect()が返ってきたときに有効なハンドルしか持っていないので、私はcantを呼び出しません。後者の場合は、ブロッキングソケットを使用していて、ファイアウォールされた場所にtcp-connectすることはできません。/

答えて

0

ソケットがブロッキングモードの場合、connect()コールを中止する唯一の方法は、ソケットは、connect()を呼び出しているものとは別のスレッドコンテキストから取得します。 connect()はエラーを返し、スレッドはそれ自体を正常に終了できます。

ソケットが非ブロッキングまたはオーバーラップモードになっている場合は、connect()WSAEWOULDBLOCKエラーですぐに戻ります、そしてあなたは、あなたのソケットを続行する前に接続が確立されたときを検出するためにselect()WSAAsyncSelect(FD_CONNECT)、またはWSAEventSelect(FD_CONNECT)を呼び出す必要があります作業。呼び出しスレッドはconnect()でブロックされていないので、定期的にコードの残りの部分の終了/中止のシグナルを確認し、検出された場合はソケットを閉じて(必要に応じて)通常通り終了します。

ソケットコードをノンブロッキングまたはオーバーラップモードで書き込むと、実際にスレッドを使用する必要はありません。 UIをブロックすることなくメインスレッド内でソケット作業を行うことができ、必要なときにソケットを閉じることができます。そのようにコードを書くにはもう少し作業が必要ですが、うまくいきます。または、スレッドを使用し続けることもできます。あなたのソケットコードはUIコードとは別に保たれますので、少し管理が容易になります。

+0

theres大きな問題は、私は操作を行うためのハンドルがありませんので、閉じることができません()。私は最初のソケットconnect()呼び出しが終了したときにのみ、このハンドルを持っています。 これはここで鶏卵問題です – willsteel

+0

あなたは 'socket()'によって返されたハンドルを閉じます。 'connect()'は既存のソケットハンドルを入力として受け取ります。新しいソケットハンドルは返されません。ですから、接続するスレッドと閉じるスレッドの両方が到達できる場所に 'socket()'のソケットハンドルを格納してください。 –