ユーザーが自分のクライアントプログラムを閉じるとき終了ボタンを押して終了すると、メッセージがサーバーに送信され、クライアントが切断したことを知らせます。ただし、クライアントがクラッシュした場合、ユーザーがプロセスを終了した場合、またはユーザーがクライアントを閉じた場合 終了ボタンを押す以外の方法 サーバーはメッセージを表示しません。
どうやってサーバーを確実に作ることができますか接続の一意性を維持しながら、接続がどのようにクローズされたかに関係なく、接続がクローズされたことを認識します(つまり、ユーザーがどのように切断したとしても
QtライブラリでC ++を使っています。やりたいことをやらせるような合図があると思っていましたが、見つけられませんでした。
回答:
回答№1は1あなたが「Qtを使っている」ので、私はあなたが使っていると思います QTcpServer。この場合、新しい接続が発生したときにあなたは戻ってきます QTcpSocket*呼び出しから nextPendingConnection()。
クライアントが信号に接続していた場合、クライアントが切断されたとき、きれいにまたは突然に 切断された()と エラーの() QTcpSocket切断が発生すると通知されます。
回答№2の場合は0
あなたは QIODevice::readChannelFinished()
それを検出するためにサーバー側のシグナル接続は閉じられました。これは、クライアントが接続を閉じたという意味では関係ありません。これは、サーバー側でクライアントのクラッシュに対処するための最後の手段として役立ちます。
クライアント側から積極的に通知するには、アプリケーションの種類に依存します。 GUIアプリケーションをお持ちの場合は、 QCoreApplication::aboutToQuit()
アプリケーションが通常の方法で閉じられたことを通知するシグナル。
すべての可能性を捉えるためのQtメソッドがないため、コンソールアプリケーションは扱いが困難です。 Windowsでは、あなたは コンソールコントロールハンドラ。これはコマンドボックス、Ctrl-Cなどを閉じることに反応します。