1

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 つのタイプにまとめるにはどうすればよいですか?

考えられるすべてのエラーの値を含む列挙型を使用する必要がありますか?

簡単なエラー コードとエラーの説明はありますか?

また、多くのソケット エラー条件のうち、何を処理する必要があるのでしょうか? 私が遭遇することを期待しているものだけ?それとも全員?

4

1 に答える 1

1

DisconnectEventArgsを含まないのはなぜですかpublic Exception Error { get; set; }Errorが正常に呼び出された場合は nullDisconnectです。それ以外の場合は、Socket または Http 例外が含まれます。

于 2013-02-08T21:33:17.233 に答える