2

モバイルとPC(サーバー)の間でクライアントサーバー通信を行っています。通信には 4 つのソケットがあります。そのうちの 2 つはデータの送受信用で、残りの 2 つは切断をできるだけ早く検出する必要があるため、ある種のキープアライブ用です。

接続に問題がなければ、データは問題なく移動します。しかし、サーバーとクライアント間の接続が切れていない限り、キープアライブ (2 つのソケットを思い出してください) チャネルが常にデータを送信していることを確認するために、いくつかの優先順位を確立したいと考えています。

どうすればこれを達成できますか?

助けてくれてありがとう。

4

2 に答える 2

5

4 つのソケットを使用したセットアップについて質問します。

まず、リモート エンドがいつ停止したかを検出するための別の接続を使用しても利点はありませんが、実際には、その「キープアライブ」接続がダウンしても「データ」接続がまだ無傷である場合に競合状態が発生します。アクティビティがない場合、同じデータ接続で定期的なハートビートを実装します。

次に、同じノード間の 2 つの独立したデータ接続が帯域幅をめぐって競合します。通常、ネットワーク スタックは接続の境界を越えて最適化されないため、2 倍の TCP オーバーヘッドが発生しますが、利益はありません。同じ TCP 接続を介してデータ交換を実装します。スループットが向上します (レイテンシがわずかに増加する可能性がありますが、適切な測定のみがそれを示します)。

最後になりましたが、4 つの接続には 4 つのリッスン TCP ポートが必要であるため、ファイアウォールのどこかに 4 つの穴が開く可能性があります。それを単一のポートに減らすと、そのファイアウォールの管理者は永遠にあなたの友達になります.

于 2012-11-07T17:46:48.693 に答える
0

送信に TCP を使用する場合、TCP プロトコル スタックは、データを送信しようとして (TCP) 接続が切断されるたびに通知します。サーバーとクライアントの両方のコードを制御する場合は、TCP を介したデータ転送の間にハートビートを実装することをお勧めします。

それぞれのデバイスでの TCP の接続障害検出が目的に対して遅すぎる場合は、「SNMP エコー リクエスト」別名「ping」など、クライアントとサーバー間に単一パケットのピンポン スキームを実装できます。または、SNMP がオプションでない場合は、おそらくUDPパケットを前後に送信するとうまくいくでしょう。

いずれにせよ、ある種のタイムアウト メカニズム (TCP スタックに既に実装されている) が必要になります。これは、切断された接続の検出が、タイムアウト時間によって制限された遅延時間で遅延されることを意味します。

于 2012-11-07T17:28:19.060 に答える