1

私はc++でソケットクライアントサーバープログラムを作成しました。プログラムは完全に機能します。私が今やりたいのは、接続されているクライアントが使用可能かどうかを定期的に確認することです。サーバープログラムでwhile(true)ループを使用して実行できることを知っています。ただし、より多くのCPUリソースを使用します。クライアントの可用性をチェックする他の効率的な方法はありますか?ハートビートと呼ばれるものを聞いたことがあります。それは私を助けますか?これを行う他の方法はありますか?

4

2 に答える 2

2

定義上、クライアントは「接続」されていますか、「利用可能」です。そうでない場合、「接続」されません。持続的接続が必要な場合は、持続性を提供するトランスポートプロトコル(TCPなど)を使用して、TCPにその役割を任せます。独自のキープアライブタイマーと再送信タイマーは、ネットワーク特性を満たすようにすでに設定されています(そうでない場合、これはシステムの問題であり、特定のアプリケーションが単独で管理する必要があるものではありません)。データを送受信し、一方の当事者が立ち去ったり連絡が取れなくなったりした場合に最終的に発生する接続エラーを管理するだけです。

とにかく:

  • テストのためだけに空のメッセージを送受信するダム無限ループを実行しないでください。インターネットのノードには数十億があります。誰かがそのように振る舞うと、インターネット全体が「ピンポン」でいっぱいになります。曲げ幅にはコストがかかります。CPUとメモリ以上のもの。それを無駄にしないでください。

  • 自分でタイムアウトしようとしないでください。o欠落しているパケットを回復してください。ネットワークがパケットの再ルーティングまたは破棄を決定できる理由を想像することさえできない100分の1の正当な理由があります。TCPとIPが一貫してその役割を果たすようにします。ネットワークの問題を解決しようとするすべてのアプリケーションは、ネットワーク管理者に混乱を加えるだけです。

  • 非常に簡単に言えば、ソケットが開いていてエラーがない場合は、コンピューターが接続されています。エラーが発生した場合は、閉じてから再度開いてみてください(トランスポートプロトコルのタイムアウトを待ちます。最大で数分かかる場合がありますが、ネットワークプロトコルのルールから逃れることはできません。ネットワーク内で一人でいるだけです。そして、それらのルールを作ることができるのはあなたではありません)。

于 2013-01-15T10:01:13.410 に答える
0

無限ループではなく、タイムリーにメインイベントを発生させてみませんか?

最新のMBアーキテクチャとメモリ設計では、再利用性を実装するためにいくつかの特殊なキャッシュメソッドを適用することで、memチャンクを割り当てたり再割り当てしたりする必要がなくなり、外部と内部の両方でフラグメントが多すぎるのを防ぐことができると聞いたことがあります。私は今、私のオンライン教授のオンラインインタビューを聞いているので、これをもう一度チェックしてもかまいません...:D。頑張って検索してください!

[編集] ongardpingメソッドをタイムリーに使用して他の返信を読み上げました。これは非常に便利ですが、クライアントが他のコンピューターからのpingをブロックできることも考慮してください。

于 2013-01-15T09:43:21.147 に答える