Socket.Connect 抛出和错误我无法捕捉
本文关键字:错误 Connect Socket | 更新日期: 2023-09-27 18:33:42
如果这个问题在SO上得到回答,我深表歉意。我看了看,但没有找到。我的情况是,我的客户可以通过本地网络或通过Verizon调制解调器远程进入来连接到他们的TCP服务器。(我正在使用.NET 3.5 - C#(
当我从其中任何一个连接时,一切都很好。但是,如果我不小心进入了"错误"的网络(例如:我在星巴克并登录到他们的无线网络。我忘了,以为我在Verizon卡上,所以,现在我尝试登录(服务器拒绝连接。好。但是我的尝试/捕获没有捕获任何东西...它只是退出例程(如果我通过线程池调用它(,或者如果我直接调用它,它会挂起。
这是代码(失败于: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 可能产生的每个错误,但它从未捕获任何内容。当我运行调试器时,只要我点击该行,它就会退出我的方法,但没有可捕获的错误。
如果您确实在异步等待(如您在评论中所述(,那么您可能会在实际获得异常之前退出 try/catch 块。
它退出你的方法,因为你的 catch 块内有一个 return 语句。您告诉它显式返回。
好吧,我认为彼得走在正确的轨道上。 似乎调试器只是跳过我的连接行并在等待 Socket.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;
}