私のソケットの周りにそれが構築されるときに例外ハンドラデリゲートを所有者クラスから渡されます。例外ハンドラdelegateは、例外の引数と、それをスローしたAsyncComm
インスタンスへの参照を受け取ります。私はそのように、彼らはチェーンを自分の例外を投げることができAsyncComm
で私の非同期ハンドラメソッドのそれぞれに
try
{
// Do stuff here
{
catch (Exception e)
{
CallExceptionHandlerDelegate(e, this);
}
を置きます。私のケースでは、例外ハンドラは
AsyncComm
インスタンスへの参照を使用して
AsyncComm
インスタンスのメソッドを呼び出し、ソケットを再初期化するように指示します。継続的に停止するために必要な行動を、
SocketExceptions
に変更することができます。
例外が発生したエンドポイントの決定に関しては、現在私が持っている唯一のアイデアは、SocketException.Message
文字列の最後からエンドポイントを解析することですが、それはかなりのようなものです。
更新:クルージュですが動作します。以下のコードを解析してください。そのうちのいくつかはthis questionから取られています。
private IPEndPoint parseEndPointFromString(string input)
{
// Matches 1-255.1-255.1-255.1-255:0-65535. I think.
const string IPPortRegex = @"(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):(6553[0-5]|655[0-2]\d|65[0-4]\d\d|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}|0)";
Match match = Regex.Match(input, IPPortRegex);
if (match.Success)
{
string IPPortString = match.Value;
string[] ep = IPPortString.Split(':');
if (ep.Length != 2) throw new FormatException("Invalid endpoint format");
IPAddress ip;
if (!IPAddress.TryParse(ep[0], out ip))
{
throw new FormatException("Invalid IP address");
}
int port;
if (!int.TryParse(ep[1], out port))
{
throw new FormatException("Invalid port");
}
return new IPEndPoint(ip, port);
}
else
{
throw new FormatException("Invalid input string, regex could not find an IP:Port string.");
}
}