2011-02-01 4 views
3

私は、基本的にIPEndPointで応答するサーバーを見つけるためのポートをブロードキャストするServerLocatorを作成しています。現在のIPHostに何も見つからない場合、それから次のものに進む。ハンドルをSocket.ReceiveFromで処理すると、スマーミングコンソールなしでタイムアウトが発生する

今、私はこのような何かをしています(それが唯一の私の問題を表示するために必要とされるものを含んでいるので、私はこのコードの一部を削除しました。ここで起こっていくつかのクライアントバインディングもあります)

string serverIp = string.Empty; 
while(string.isNullOrEmpty(serverIp)) 
{ 
    foreach (IPAddress adress in ipHosts.AddressList) 
    { 
     using(Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) 
     { 
      try 
      { 
       client.ReceiveFrom(buffer, ref tempRemoteEP); 

       //Get server IP 
       serverIp = tempRemoteEP.ToString().Split(":".ToCharArray(), 2)[0]; 
       break; 
      } 
      catch(SocketException e) 
      { 
       // We expect connection attempt to time out if we cant find any server on this port and nic. Just continue with the next 
       if (e.SocketErrorCode == SocketError.TimedOut) 
       { 
        continue; 
       } 
      } 
     } 
    } 
} 

コンソールがでスパムされることを除いて期待通りにこれは動作します:

型「System.Net.Sockets.SocketException」の最初のチャンス例外がSystem.dllの中

を発生しました

コンソールをスパムすることなくこのような例外を処理する良い方法はありますか?または、タイムアウトからの例外の必要性を避けるために、これを他の方法で処理できますか?

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

+0

RELESE設定でプロジェクトをビルドしても、それは起こりません。 – Cipi

+0

それは本当ですが、それは多くのスパムにはそれが動作するのが難しくなる場合 – Bakery

答えて

1

プログラムが実行されている場合、プログラムで送信されるこれらの例外がたくさんあります。これについて心配する必要はありません。 「初めての例外」の詳細については、this articleを参照してください。

また、例外を処理する方法についてVisual Studioを構成する方法については、this linkをチェックしてください。これらを設定すると、例外の代わりに(継続する代わりに)中断して、実際に何が起こっているのかを見ることができます。ただし、例外を隠すことはデバッグでは機能しないように見えることに注意してください。hereまたはhere @Cipiが指摘したように、リリースでは表示しないでください。

+0

ありがとう。私が心配しているわけではありません、私はちょうどそれをきれいに保つのが好きです。どういうわけか、論理の一部が間違っているので、例外を使うような感じがします。 – Bakery

+0

C#を選んだ理由は? :) – Default

+0

hehe。本当のこと:) – Bakery