Embarcadero RAD スタジオとTServerSocketコンポーネントをブロッキング モードで使用して C++ アプリケーションを作成しています。ソケットのハンドラーをオーバーライドして、デフォルトメソッドをオーバーライドOnGetThreadする派生元のカスタム クラスを作成しました。この関数内で、 を使用して 、 、およびを呼び出し、データを送受信します。私が読んだすべてのことによると、これは物事を進めるための許容できる方法です (ただし、これが間違っている場合は修正してください)。TServerClientThreadClientExecute()TWinSocketStreamWaitForData()Read()Write()
この回答からブロッキングソケットに対してどのイベントが発生しますか? OnClientErrorイベントが発生するため、ブロッキング モードでハンドラーを使用しても問題ないと考えるようになりました。私のイベント ハンドラでは、エラー コードを毎回 0 に設定して、例外がスローされないようにしています。
さらに、関数を呼び出すたびに、Read()または関数Write()内からClientExecute()try-catch ブロックでラップし、ESocketError例外をキャッチします。
私の質問はこれです:これは最良のアプローチです:
- ソケット エラー イベント ハンドラーを使用してすべてを処理します (デバッグ目的でソケット エラー コードを表示できるため、これは便利です)。
- アプリケーションが例外をスローしないように try-catch ステートメントを使用する
- 両方を使用します (ただし、ハンドラーでエラー コードをゼロに設定しないと、例外がスローされず、上記の 2. が無意味になります)。
これは古いコンポーネントであり、廃止されましたが、これを使用する必要がありますが、正しく使用するための鋳鉄ガイドを見つけることができなかったため、多くの情報源からのアプローチをまとめました. かなり長い間うまく機能していますが、サーバーがそれ以上のクライアント接続を受け入れることを妨げるサイレントエラーが時々発生しますが、出力もスローもOnClientErrorありません。ESocketErrorsこのアプリケーションは組み込みデバイスで実行されているため、応答しなくなった場合にのみ検出されます。
上記の 3 つのアプローチのどれが最適か (または別の方法を提案するか) について誰かがアドバイスをくれたら、とても感謝しています。