IConnection というインターフェイスがあります
public interface IConnection
{
bool IsConnected { get; }
Task ConnectAsync(IEndPoint remoteEP);
Task<int> SendAsync(byte[] data, int offset, int size);
Task<int> ReceiveAsync(byte[] buffer, int offset, int size);
void Disconnect();
void Close();
event EventHandler<DisconnectedEventArgs> Disconnected;
}
これは、ソケット ベースの接続クラスと HTTP ベースの接続クラスの 2 つの異なるタイプの接続によって実装されます。また、将来的に他の接続タイプを追加するオプションも必要です。
メインの ChatClient クラスで接続を開始するときに、ユーザーの構成を確認し、ユーザーの好みに応じて SocketConnection または HTTPConnection を作成します。それ以降は、IConnection インターフェイスを使用した接続のみを参照します。
IConnection クラスには、ユーザーが Disconnect を呼び出したとき、または予期しない接続エラーが発生したときに発生する Disconnected イベントがあります。DisconnectedEventArgs には、切断が発生した原因に関する情報が含まれます。
私が疑問に思っているのは、さまざまな種類のエラーをどのように抽象化するのですか?
ソケットは、以下を含むがこれに限定されない、切断の原因となるさまざまなエラー状態に遭遇する可能性があります。
- リモート側が正常な切断を開始しました (つまり、読み取りは 0 を返します)
- 読み取り/書き込みは、フラグ SocketError.ConnectionAborted で SocketException をスローします
- 読み取り/書き込みは、フラグ SocketError.NetworkReset で SocketException をスローします
http 接続では、次のようなさまざまなエラー状態が発生する可能性もあります。
- リモート サーバーのポーリングの失敗 -- たとえば、ホストが突然消える
- HTTP 認証クレデンシャルが拒否されました
ソケットで発生する可能性のあるすべてのエラーと、http 接続で発生する可能性のあるすべてのエラーを 1 つのタイプにまとめるにはどうすればよいですか?
考えられるすべてのエラーの値を含む列挙型を使用する必要がありますか?
簡単なエラー コードとエラーの説明はありますか?
また、多くのソケット エラー条件のうち、何を処理する必要があるのでしょうか? 私が遭遇することを期待しているものだけ?それとも全員?