2012-05-10 6 views
1

これはSOに答えられている場合はお詫び申し上げます。私は見たが、それを見つけられなかった。私の状況は、顧客がローカルネットワーク上にいるか、またはVerizonモデム経由で遠隔地に入ることによって、自分のTCPサーバーに接続できることです。 (私は.NET 3.5 - C#を使用しています)Socket.Connectスローとエラーキャッチできません

これらのいずれかから接続すると、問題はありません。しかし、私が誤って "間違った"ネットワークにいる場合(例えば、私はスターバックスで無線ネットワークにログオンしています。私はVerizonカード上にいると考えているので、ログインしようとしています)接続。ファイン。しかし、私の試して/キャッチは何もキャッチしていない...それは単にルーチンを終了する(私はスレッドプールを通じてそれを呼び出す場合)またはそれを直接呼び出す場合は、ハングアップします。ここで

がコードである(それは上の失敗:m_clientSocket.Connect(IPEND)):これはで呼び出され

tcpConnectionObject passObject = new tcpConnectionObject(serverIP, serverPORT); 
     ThreadPool.QueueUserWorkItem(new WaitCallback(SRVR_CONNECT.connectToTCP), passObject); 

tcpConnectionObject passedTCPObject = (tcpConnectionObject) obj; 
if (checkNetStat(passedTCPObject) == false) 
{ 
    updateStatus(false); 
    return; 
} 

try 
{ 
    m_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    IPAddress ip = IPAddress.Parse(passedTCPObject.ipString); 
    int iPortNo = System.Convert.ToInt16(passedTCPObject.portString); 
    IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo); 

    m_clientSocket.Connect(ipEnd); 
    if (m_clientSocket.Connected) 
    { 
      updateStatus(true); 
      //Wait for data asynchronously 
      WaitForData(); 
    } 
} 
catch (SocketException e) 
{ 
    updateStatus(false); 
    return; 
} 
catch (Exception e) 
{ 
    updateStatus(false); 
    return; 
} 

updateStatus(true); 
return ; 

私はスレッドプールを使用してWinフォームからこれを呼び出しますフォームのSHOW()メソッド私がこのようにすると、私のフォームが表示されますが、ステータスは決して変更されません(結果によって変わりません)。デバッガを置いて実行を進めると、Socket.Connect()デバッガは単にmthodを終了し、私のフォームが表示されます。私は私のキャッチのいずれかを打つことはありません。

私はSocketが生成できるすべてのエラーを試しましたが、決して何も捕捉しません。デバッガを実行すると、その行にヒットすると直ぐにメソッドが終了しますが、キャッチ可能なエラーはありません。

+0

それはあなたがそれをせずにバックグラウンドスレッドを終了することをhtinkなぜ私が疑問直接呼び出す場合ぶら下がっに基づいて、お知らせ。バックグラウンドスレッドもハングアップしていると思います。 – JaredPar

+0

例外がスローされたときに停止するようにデバッガを設定していますか? –

+0

@IgbyLargemanは私が何を考えているかを確認するように提案しました。ステップスルーすれば、例外に入ることはありませんか? – MStodd

答えて

0

実際に例外を取得する前に、(あなたのコメントに記載されているように)非同期で待っていると、try/catchブロックを終了している可能性があります。

+0

それは決してその行には届かない(私は見ることができる)。私がデバッガをステップ実行するとき、私は接続をヒットするとメソッドを単に終了する。デバッガがプールスレッドによって混乱しない限り、... – MarkJoel60

+0

何か非同期を実行しているなら、複数のスレッドを持つでしょう。それはトレースするのが難しいです。 WaitForDataで何をしているのか、それが「非同期でデータを待つ」かどうかを確認できますか? –

+0

ピーター、私はあなたが多かれ少なかれ正しいと思うので、あなたの答えを受け入れるつもりです...私はより完全な答えを持っていますが、あなたの健全性チェックは正しい道に私を向ける... – MarkJoel60

0

キャッチブロック内にreturn文があるため、メソッドを終了します。あなたはそれを明示的に返すように指示しています。

+0

はい、私はすべてのリターンにブレークポイントを設定し、どれもヒットしません。 – MarkJoel60

0

OK、私はピーターが正しい軌道に乗っていたと思います。 Socket.Connect()が終了するのを待っている間に、デバッガが単に私のConnectラインをスキップして次のラインに移動したように思えます。

これは動作するコードの変更です。私はパケットの作成とコールバック定義を "WaitForData"から移動し、代わりにbeginConnectメソッドを使用します。それから私は私がそれを知ることができます失敗し、タイムアウトを設定することができます - ので、コードはこれに変更されます。

try 
     { 
      m_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      // Cet the remote IP address 
      IPAddress ip = IPAddress.Parse(passedTCPObject.ipString); 
      int iPortNo = System.Convert.ToInt16(passedTCPObject.portString); 
      // Create the end point 
      ipEnd = new IPEndPoint(ip, iPortNo); 

      Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      SocketPacket theSocPkt = new SocketPacket(); 
      if (m_pfnCallBack == null) 
      { 
       m_pfnCallBack = new AsyncCallback(OnDataReceived); 
      } 
      // Give It 5 Seconds to connect 
      IAsyncResult result = socket.BeginConnect(ipEnd, m_pfnCallBack, theSocPkt); 
      bool success = result.AsyncWaitHandle.WaitOne(5000, true); 

      if (!success) 
      { 
       socket.Close(); 
       throw new ApplicationException("Server Refused Connection"); 
      } 
      // Success 
      updateStatus(true); 
     } 
     catch (SocketException e) 
     { 
      updateStatus(false); 
      return; 
     } 
     catch (Exception e) 
     { 
      updateStatus(false); 
      return; 
     } 
関連する問題