0

私は選択ベースのサーバーを持っています。ソケットはブロッキング モードですが、select() 関数では 250 ミリ秒を使用しています。タイムアウト。

基本的に、私のサーバーは 1 つのクライアントのみを受け入れ、そのクライアントにデータを送信します。サーバーからクライアントにデータを送信するだけで、何週間も問題なく動作しています。

しかし、select() 行で 3 ~ 4 時間後にクライアントがサーバーにデータを送信すると、スタック オーバーフロー例外 (0xC00000FD) が発生することに気付きました。Select()のMSDNページを何十回も赤くしましたが、これに関連する言及はありません。私は本当に立ち往生しています。どんな助けでも大歓迎です。

ちなみに、ネットで見つけた例。

http://tangentsoft.net/wskfaq/examples/basics/select-server.cpp

ここでは、クライアント接続を受け入れた後、非ブロッキング モードに設定しています。そして、次のようにコメントされています。

 // Mark the socket as non-blocking, for safety.

上記の「安全」とは何を意味しますか?これは私の問題だと思いますか?私の実装では、接続されているものはブロッキングモードになっているためですか?

前もって感謝します

4

1 に答える 1

1

例外は、コードにバグがあることを意味します。スタック オーバーフローが発生しているため、実行時間が長すぎる再帰ループがコード内にある可能性が高く、スタック スペースがなくなるまで各呼び出しでスタック スペースを使い果たしています。通常の状態では、select() は失敗するとエラー コードを返すため、例外を取得するには、プログラムのメモリをどこかで台無しにする必要があります。

于 2010-06-04T20:32:49.890 に答える