これは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が生成できるすべてのエラーを試しましたが、決して何も捕捉しません。デバッガを実行すると、その行にヒットすると直ぐにメソッドが終了しますが、キャッチ可能なエラーはありません。
それはあなたがそれをせずにバックグラウンドスレッドを終了することをhtinkなぜ私が疑問直接呼び出す場合ぶら下がっに基づいて、お知らせ。バックグラウンドスレッドもハングアップしていると思います。 – JaredPar
例外がスローされたときに停止するようにデバッガを設定していますか? –
@IgbyLargemanは私が何を考えているかを確認するように提案しました。ステップスルーすれば、例外に入ることはありませんか? – MStodd