1

イベント通知のために、長持ちする TCP 二重接続を実装する必要があります。クライアントはイベントを登録し、サーバーはこのイベントについてすべてのサブスクライバーに通知します。

問題は、TCP 接続が 10 分後に閉じられることです。私は信頼できるセッションについて知っています。クローズおよび非アクティブ タイムアウト。

私が必要とするのは、クライアントとサーバーの間にある種の「常に開かれた接続」を実装することです。クライアントは、接続が失われたことに気付くとすぐに再接続します。ただし、TCP で接続しているときに一部の接続が失われることに気付くのは難しい場合があります。

長い受信タイムアウトと非アクティブ タイムアウトを使用して、ある種のソリューションを発明することができました。サーバーがまだオンラインで、ある種の KeepAlive() メソッドを使用して接続されている場合、クライアントは短い間隔でサーバーを「パルス チェック」します。

サービス コントラクトに KeepAlive() メソッドを使用せずにソリューションを提供したいと考えています。

何か案は?

//ミロ

4

1 に答える 1

2

TCP 接続は自然には閉じません。それらは明示的に閉じられているか、エンドポイントの 1 つが消失しています。(注: エンドポイントは、中間の透過プロキシまたはステートフル ルーターにすることができます。) 私は、キープアライブがなくても、数か月とは言わないまでも、数日間稼働している TCP 接続を頻繁に実行します。

前者の場合、明示的な閉鎖はあなたの側に通知されますが、それは起こっていないようです.

エンドポイントが消失した場合、相手側が消失したかどうかを確認する唯一の方法はデータの送信であり、キープアライブはそれを透過的に行う方法です。

int delay = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPIDLE,&delay,sizeof(delay));
int count = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPCNT,&count,sizeof(count));
int interval = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPINTVL,&interval,sizeof(interval));
int enable = 1; setsockopt(sockfd,SOL_SOCKET,SO_KEEPALIVE,&enable,sizeof(enable));

TCP のキープアライブを使用したくない場合は、実際のデータを定期的にサーバーに送信するか、クライアントからサーバーへの経路に沿って接続が切断されている原因を突き止める必要があります。

于 2011-05-31T07:21:27.470 に答える