2010-11-23 12 views
4

私は、TCPを使用してお互いに接続する2つのアプリケーションを開発中です。ある時点でTcpClientを使用して接続しようとしていますが、他のアプリはTcpListenerを使用してまだリスンを開始していない可能性があります。サーバが例外処理なしでリッスンしているかどうかを確認する方法

私の最初の試みは、このでした:

TcpClient c = null; 
while (true) 
{ 
    try 
    { 
     c = new TcpClient(); 
     c.NoDelay = true; 
     c.Connect(ip, port); 
     break; 
    } 
    catch (SocketException ex) 
    { 
     Console.WriteLine(string.Format("Could not connect to {0}:{1}, retrying...", ip, port)); 
     Thread.Sleep(500); 
    } 
} 

しかし、これに伴う問題は、私はVSは、任意のスローをキャッチするように設定されているので、それは、私にとっては迷惑のビットである例外処理に依存しているということです例外(「デバッグ - >例外...」メニュー)。だから、接続しようとするたびに、それはVSに壊れて、私は続行を押す必要があります。

私が手に例外がある:対象のコンピュータによって拒否されたため

接続が確立されていないことができ、私がチェックする方法があるだろうと想像127.0.0.1:50000

サーバーが実際に接続しようとせずに特定のポートでリッスンしている場合。私はちょうど十分なものではないということを理解しています。サーバはチェックと接続の試行の間に落ちるかもしれませんが、私が開発している間はまだそれがずっと優れています。

またはこのような何か:これに類似

TcpClient tcpClient = new TcpClient(); 
while (!tcpClient.TryConnect(....)) 
{ Thread.Sleep(1000); } 

if (bool.TryParse("false")) 
{ ... } 

私はまた、手動で非同期メソッドを使用して(/エンド接続を開始します)とManualResetEventのタイムアウトを設定しようとしたが、そのどちらもうまくいきませんでした。私はインターネットを精査しましたが、私はこの問題の解決策を見つけることができませんでした。それは私が最終的にここに投稿している理由です:)

答えて

4

VSが例外を壊しているという問題はありますか? VSでは、特定の例外ファミリを常に無視することができます。

VSでは、[デバッグ]メニューの[例外...]を選択し、表示されるダイアログでこれを制御できます。

1

私はそれを自分でテストすることを提案する前に、例外をキャッチすることを勧めようとしていました。例外をスローしなくてもすべての例外をスローするように設定すると、例外はすべてスローされます。 Shiv Kumarに同意する必要があります。アプリケーションのデバッグ中に設定を調整するか、自分が行っていることの制限を受け入れるかのどちらかです。

bool.TryParseが動作する理由は、Int32.TryParseが文字列の各文字が0-9またはその他の有効な数値シンボルであることを確認する方法と同様に、それぞれの文字をすべてverifysすることです。

もちろん、独自のネットワーククラスを作成して、接続が失敗したときに例外をスローすることはできません。

TryParseは例外をスローしません。try {} catch {}によってbool.Parseを使用すると例外がスローされます。そうでない場合、ブール値ではないものを解析しようとすると、未処理の例外。 TryParseは.NETの歴史の後半に追加されました。Parseは従来のメソッドのほうが多く、プログラマーは予期しない入力をすべて処理し、データを解析する前に入力を検証できます。

私はTryParseはfalseを返すことを追加する必要があります

場合はその両方の方法の結果が偽であると私は信じていないうち変数がfalse.Thisは、少なくとも

http://msdn.microsoft.com/en-us/library/system.boolean.tryparse.aspx

のInt32

の場合であるの値を解析できません

TryParseとParseの仕組みは、TcpClientとはまったく違う獣であることを指摘しています。 1つは例外をスローし、もう1つはそうでないことを除いて、基本的な検証プロセスは同様であることを明確にすべきだと思います。もちろん、実際に解析されたものが返されます。

+0

(トピックを少しビットオフ):私は、bool.TryParseとParseの内部動作が同じである(つまり、同じ方法で文字列をチェックする)ことを前提としています。入力。そうではないと言っていますか? – Srekel

+0

@Srekel私の改訂版の回答を参照してください。 –

関連する問題