これがSOで回答された場合はお詫び申し上げます。見ましたが見つかりませんでした。私の状況では、顧客はローカルネットワーク上にいるか、Verizonモデムを介してリモートで接続することにより、TCPサーバーに接続できます。(私は.NET 3.5-C#を使用しています)
どちらからでも接続すれば大丈夫です。しかし、誤って「間違った」ネットワークに接続した場合はどうなりますか(例:スターバックスにいて、ワイヤレスネットワークにログオンしています。Verizonカードを使用していると思っていたので、今はログインしようとしています)サーバーは拒否します繋がり。罰金。しかし、私のTry / Catchは何もキャッチしていません...それは単にルーチンを終了するか(スレッドプールを介して呼び出している場合)、直接呼び出すとハングします。
コードは次のとおりです(失敗します:m_clientSocket.Connect(ipEnd)):
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 ;
スレッドプールを使用してWinformからこれを呼び出します。
tcpConnectionObject passObject = new tcpConnectionObject(serverIP, serverPORT);
ThreadPool.QueueUserWorkItem(new WaitCallback(SRVR_CONNECT.connectToTCP), passObject);
これは、フォームのSHOW()メソッドで呼び出されます。このようにすると、フォームは表示されますが、ステータスは変更されません(結果によって変更されるはずです)デバッガーを配置して実行をステップ実行すると、Socket.Connect()に到達します。デバッガーはmthodを終了するだけで、フォームに表示されます。キャッチをヒットしたことはありません。
Socketが生成する可能性のあるすべてのエラーを試しましたが、何もキャッチされません。デバッガーを実行すると、その行に到達するとすぐにメソッドが終了しますが、キャッチ可能なエラーはありません。