2011-10-18 3 views
1

私はC#には比較的新しいので、私に同行してください。C#TCP server:アプリケーションレベルで再送が必要ですか?

私はTCPクライアントサーバーアプリケーションを作成しています。クライアントが送信するすべてのメッセージがサーバーに配信されるようにする必要があります。クライアントはデータを送信し、サーバーはACKを返します(アプリケーションレベルで実装されます)。

私は、ネットワーク層がエンドポイントコンピュータがデータを受け取ることを保証する(またはスローする)ことを知っています。

私が知りたいのは、サーバーコンピューターがクライアントからデータを受信する可能性がありますが、サーバーアプリケーションに何も問題がない場合、データがサーバーアプリケーションに配信されないことです。

ありがとうございました。

答えて

3

このではありませんが、高負荷と低メモリでは奇妙なことが起こります。

このアプローチに対応する最も良い方法は、クライアント - >サーバーからのメッセージにシーケンス番号を含めることです。

クライアントがACKを受信しなかった場合、古いシーケンス番号で再送信できます。サーバがすでに同じシーケンス番号のメッセージを受信して​​いる場合、サーバはそれを無視できます。

2

TCPプロトコルは、ほとんどのケースの損失/欠落/衝突パケットを処理するため、コードレベルでこれを処理する必要はありません。ただし、接続/通信のタイムアウト、トランスポートレベルのエラーなどのケースを処理する必要があります。これらは.NETソケットライブラリから例外として送出され、キャッチして処理しないとアプリケーション全体がクラッシュします。これらの例外に対する通常のエラー処理は、単に接続を再試行することです。

関連する問題