2011-06-23 16 views
4

私はサーバー側でUdpClientを使用しており、クライアント側(複数のクライアント)にデータを送信しています。 突然、クライアントはudpポートのリッスンを停止し、endRecieveまたはbeginRecieveを呼び出すときにSocketExceptionが発生してサーバーがヒットします。どのエンドポイントがSocketException、UdpClientを引き起こしたかを調べる方法

私の理解によれば、これは「ICMP Destination Unreachable」のためであり、サーバにポートが閉じていることを伝えるだけです。それは大丈夫ですが、SocketExceptionsのどちらも、どのエンドポイントから来たのかわかりません。

どのエンドポイントが閉じられているので、サーバーが送信を停止し、さらに多くのSocketExceptionsが発生するのかをどのように知ることができますか?

また、これらのSocketExceptionsをスローするのをUdpclientがスローするのを防ぐ方法があります。そうすれば、クライアントがタイムアウトするようにすることができます。 (

私はCOMMラッパークラスを持っている:私は自分自身がそう、私は誰もがよりよい解決策を思い付くかどうかを確認するために興味を持つだろうが、今の私はカップルのアイデアを持っている同じ問題を扱っています

答えて

0

私のソケットの周りにそれが構築されるときに例外ハンドラデリゲートを所有者クラスから渡されます。例外ハンドラ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."); 
    } 
} 
関連する問題