0

Embarcadero RAD studio C++ builder XE を使用して C++ アプリケーションを作成しています。アプリケーションは、動的に作成されたTServerSocketコンポーネントをブロッキング モードで使用します。TServerClientThreadカスタムClientExecute()メソッドを提供する派生クラスを作成します。このクラスは、私が実装したTServerSocketイベント ハンドラーを介して作成されます。、、およびOnGetThreadのイベント ハンドラーを割り当てます。スレッド クラス内では、class を使用してソケット接続から読み書きします。OnAcceptOnClientConnectOnClientDisconnectOnClientErrorTWinSocketStream

を作成するカスタム作成クラス ( から派生TComponent)を使用し、TServerSocket割り当てるイベント ハンドラーはこのクラスのメンバー関数です。

OnAcceptとイベントが発生しますが、とイベントのOnClientDisconnectどちらも発生しません。これは、このコンポーネントの正常な動作ですか? このコンポーネントについて読んだことはすべて、すべてのイベントがブロッキング モードで発生することを示唆しており、これらのイベントが発生しない理由がまったくわかりません。さらに私がしなければならないことはありますか、それともこれらのイベントはブロッキング モードでは機能しませんか? インスタンスを別の派生クラスのメンバーとして使用すると、問題が発生する可能性はありますか?OnClientConnectOnClientErrorTServerSocketTServerSocketTComponent

4

1 に答える 1

1

OnClientConnectイベントはTServerClientWinSocketコンストラクターによってトリガーされます。TServerClientWinSocketオブジェクトはOnGetSocket、新しいクライアント ソケットが WinSock によって受け入れられたときにイベントが呼び出された直後、OnAcceptおよびイベントが呼び出される直前に構築さOnGetThreadれます。したがって、呼び出されない唯一の方法OnClientConnectは、実際にハンドラーが割り当てられていない場合です。

OnClientError非ブロック ソケットの障害時に呼び出され、 、 、および によって呼び出さTCustomWinSocket.SendStream()TCustomWinSocket.SendBuf()ますTCustomWinSocket.ReceiveBuf()。代わりに I/O に使用TWinSocketStreamすると、これらのメソッドは呼び出されません。代わりESocketErrorに、失敗時に例外が発生します。これらの例外をキャッチしない場合、呼び出しTServerClientThread は単純に終了します (処理のために例外をメイン スレッドに渡した後)。

于 2013-04-15T18:04:43.563 に答える