我的异步连接代码非常简陋,如下所示:
private Socket _socket;
public void Connect(IPEndPoint remoteEndPoint, bool persistentConnection)
{
_logger.Trace("Attempting To Connect To " + remoteEndPoint.Address);
_remoteEndPoint = remoteEndPoint;
_persistentConnection = persistentConnection;
_socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
_socket.BeginConnect(_remoteEndPoint, ConnectCallback, null);
}
Connect()
方法附带ConnectCallback()
,这就是我稍后将要描述的问题:
private void ConnectCallback(IAsyncResult asyncResult)
{
try
{
_socket.EndConnect(asyncResult);
_logger.Trace("Successfully Connected To " + _remoteEndPoint.Address);
}
catch (SocketException)
{
_logger.Trace("Failed To Connect To " + _remoteEndPoint.Address);
if (_persistentConnection)
{
Thread.Sleep(TimeSpan.FromSeconds(3));
Connect(_remoteEndPoint, true);
return;
}
}
_socketWriter.AssignSocket(_socket);
_socket.BeginReceive(..);
}
我的网络代码封装在一个程序集中。今天我决定从另一个应用程序引用程序集,发现ConnectCallback
方法行为非常奇怪。
当服务器应用程序未运行时,我会调用Connect()
。这意味着连接在物理上不可能成功。由于远程端点不可用,我希望EndConnect
抛出异常。相反,EndConnect
似乎成功,因为即使套接字没有真正连接,我的代码也会调用_socket.BeginReceive
,这当然会抛出异常,因为套接字没有连接。
特别奇怪的是,如果我在开始try
大括号上放置一个断点并逐步调用回调代码,则抛出并处理异常。
这发生在本地主机上。
为什么我会遇到此行为?如何确保EndConnect
引发SocketException
连接无法一致建立?
答案 0 :(得分:0)
如果catch
为真,您只能从_persistentConnection
返回。如果没有,无论如何都要拨打BeginReceive()
。