1

Embarcadero RAD スタジオとTServerSocketコンポーネントをブロッキング モードで使用して C++ アプリケーションを作成しています。ソケットのハンドラーをオーバーライドして、デフォルトメソッドをオーバーライドOnGetThreadする派生元のカスタム クラスを作成しました。この関数内で、 を使用して 、 、およびを呼び出し、データを送受信します。私が読んだすべてのことによると、これは物事を進めるための許容できる方法です (ただし、これが間違っている場合は修正してください)。TServerClientThreadClientExecute()TWinSocketStreamWaitForData()Read()Write()

この回答からブロッキングソケットに対してどのイベントが発生しますか? OnClientErrorイベントが発生するため、ブロッキング モードでハンドラーを使用しても問題ないと考えるようになりました。私のイベント ハンドラでは、エラー コードを毎回 0 に設定して、例外がスローされないようにしています。

さらに、関数を呼び出すたびに、Read()または関数Write()内からClientExecute()try-catch ブロックでラップし、ESocketError例外をキャッチします。

私の質問はこれです:これは最良のアプローチです:

  1. ソケット エラー イベント ハンドラーを使用してすべてを処理します (デバッグ目的でソケット エラー コードを表示できるため、これは便利です)。
  2. アプリケーションが例外をスローしないように try-catch ステートメントを使用する
  3. 両方を使用します (ただし、ハンドラーでエラー コードをゼロに設定しないと、例外がスローされず、上記の 2. が無意味になります)。

これは古いコンポーネントであり、廃止されましたが、これを使用する必要がありますが、正しく使用するための鋳鉄ガイドを見つけることができなかったため、多くの情報源からのアプローチをまとめました. かなり長い間うまく機能していますが、サーバーがそれ以上のクライアント接続を受け入れることを妨げるサイレントエラーが時々発生しますが、出力もスローもOnClientErrorありません。ESocketErrorsこのアプリケーションは組み込みデバイスで実行されているため、応答しなくなった場合にのみ検出されます。

上記の 3 つのアプローチのどれが最適か (または別の方法を提案するか) について誰かがアドバイスをくれたら、とても感謝しています。

4

1 に答える 1

2

TServerSocketが新しい接続を受け入れなくなった場合は、内部TServerAcceptThreadスレッドがクラッシュしたためTServerWinSocket.Accept()に呼び出されていないか、呼び出さAccept()れているが OS エラー (システム リソースの不足など) が発生しています。いずれにせよTServerSocket、コードのこれらの特定の領域からのエラー情報を公開しないため、タイマーを使用して長い時間を検出できるほど接続が頻繁に行われない限り、サーバーが接続の受け入れを停止したことを検出して処理する方法はありません。OnClientConnectイベント間の非アクティブの実行。サーバーが受け入れられない状態になったと思われる場合は、アプリを閉じてTServerSocket.

于 2013-04-09T17:36:51.330 に答える