none
VistaでCSocket::Connect()が戻ってこない RRS feed

  • 質問

  • VC++6.0で作成したアプリがあります。
    CSocketを使って通信しています。
    サーバー側を起動してからクライアント側を起動すると正常に動作します。
    しかし、サーバー側を起動せずに、クライアント側でCSocket::Connect() を実行すると
    Windows Vista 以外ではFALSEで戻ってくるのですが、
    Vista では Connect() 関数から戻ってきません。
    ずっと待っていると1時間ぐらいしてからFALSEで戻ってきたりします。
    Vista の問題だと思うのですが、何か対策はないでしょうか。
    2009年4月13日 6:19

回答

  • しかし、サーバー側を起動せずに、クライアント側でCSocket::Connect() を実行すると
    Windows Vista 以外ではFALSEで戻ってくるのですが、
    Vista では Connect() 関数から戻ってきません。
    ずっと待っていると1時間ぐらいしてからFALSEで戻ってきたりします。
    Vista の問題だと思うのですが、何か対策はないでしょうか。
    Vistaの強化されたファイアウォールでは、そのポートが開いていないと、無応答(接続要求パケット自体を無視する)のでは?
    それまでのWindowsでは接続拒否応答を返していたとすれば、Connect関数からすぐ戻ってくると言うことに説明がつくと思います。

    http://www.microsoft.com/japan/technet/community/columns/cableguy/cg0106.mspx


    Vistaの問題と言うよりは、プログラムの問題のようにお見受けします。
    タイムアウトを適切に利用しましょう。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク sk7474 2009年4月23日 9:09
    2009年4月13日 14:43
    モデレータ
  • Vistaの問題では「なかった」場合は、以下が参考になるかも知れません。

    残念ながらCSocketクラスを使って、タイムアウトを上手に
    扱う有効な手段は存在しません。その障害を「やや軽く」する手段としては、
    CSocketをメインでないスレッド内で駆動し、やっべ!時間がかかってるしぃ・・
    と思ったら、スレッドごと破棄するという方法があります。
    あれば、CancelBlockingCall()を使えるかも知れません。(VC6.0にあったかどうか記憶がorz)
    んが、半殺しになっている場合があるので注意が必要です。

    もちろん、根本的でスマートなな解決をしたいのなら、CSocketを使わずに、
    バークレーコードで書くに越したことはありません。
    • 回答としてマーク sk7474 2009年4月23日 9:09
    2009年4月13日 10:43

すべての返信

  • Vistaの問題では「なかった」場合は、以下が参考になるかも知れません。

    残念ながらCSocketクラスを使って、タイムアウトを上手に
    扱う有効な手段は存在しません。その障害を「やや軽く」する手段としては、
    CSocketをメインでないスレッド内で駆動し、やっべ!時間がかかってるしぃ・・
    と思ったら、スレッドごと破棄するという方法があります。
    あれば、CancelBlockingCall()を使えるかも知れません。(VC6.0にあったかどうか記憶がorz)
    んが、半殺しになっている場合があるので注意が必要です。

    もちろん、根本的でスマートなな解決をしたいのなら、CSocketを使わずに、
    バークレーコードで書くに越したことはありません。
    • 回答としてマーク sk7474 2009年4月23日 9:09
    2009年4月13日 10:43
  • しかし、サーバー側を起動せずに、クライアント側でCSocket::Connect() を実行すると
    Windows Vista 以外ではFALSEで戻ってくるのですが、
    Vista では Connect() 関数から戻ってきません。
    ずっと待っていると1時間ぐらいしてからFALSEで戻ってきたりします。
    Vista の問題だと思うのですが、何か対策はないでしょうか。
    Vistaの強化されたファイアウォールでは、そのポートが開いていないと、無応答(接続要求パケット自体を無視する)のでは?
    それまでのWindowsでは接続拒否応答を返していたとすれば、Connect関数からすぐ戻ってくると言うことに説明がつくと思います。

    http://www.microsoft.com/japan/technet/community/columns/cableguy/cg0106.mspx


    Vistaの問題と言うよりは、プログラムの問題のようにお見受けします。
    タイムアウトを適切に利用しましょう。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク sk7474 2009年4月23日 9:09
    2009年4月13日 14:43
    モデレータ
  • こんにちは。中川俊輔です。

    仲澤さん、Azuleanさん、回答ありがとうございます。

    兼田さん、フォーラムのご利用ありがとうございます。
    その後いかがでしょうか?疑問は解決しましたか?
    有用な情報と思われたため、仲澤さん、Azuleanさんの回答へ回答マークをつけさせていただきました。

    また、かなり古い情報なのですが参考になりそうな技術分文書を紹介させていただきます。
    How To Configure a Time-Out on a CSocket Operation(機械翻訳の日本語が解りにくいので、英語版もご参照ください。)
    http://support.microsoft.com/kb/138692/

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年4月23日 9:15