客户端套接字无法连接,但未引发SocketException

本文关键字:SocketException 套接字 连接 客户端 | 更新日期: 2023-09-27 18:28:28

我的异步连接代码非常初级,如下所示:

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

客户端套接字无法连接,但未引发SocketException

只有当_persistentConnection为true时,才从catch返回。如果没有,您可以拨打BeginReceive()