如果已在SO上回答,我道歉。我看了,但没找到。我的情况是我的客户可以通过本地网络连接到他们的TCP服务器,或通过Verizon调制解调器远程连接。 (我使用的是.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 ;
我使用threadpool从Winform调用它:
tcpConnectionObject passObject = new tcpConnectionObject(serverIP, serverPORT);
ThreadPool.QueueUserWorkItem(new WaitCallback(SRVR_CONNECT.connectToTCP), passObject);
这在表单的SHOW()方法中调用。当我这样做时,我的表单显示,但状态永远不会改变(它应该是任何结果)如果我在其上放置一个调试器,并开始逐步执行,我到达Socket.Connect()并且调试器只是退出mthod,我的表单显示。我从未碰过任何一次捕获。
我已经尝试过Socket可以生成的每个错误,但它从未捕获任何内容。当我运行我的调试器时,只要我按下该行,就会退出我的方法,但没有可以捕获的错误。
答案 0 :(得分:0)
它会退出您的方法,因为您在catch块中有一个return语句。你告诉它明确返回。
答案 1 :(得分:0)
如果你真的在异步等待(正如你在评论中所述),那么你可能会在实际获得异常之前退出try / catch块。
答案 2 :(得分:0)
以下是有效代码的更改...我将数据包创建和回调定义移出“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;
}