即使没有服务器,Tcp.BeginConnect也认为它已连接

时间:2017-12-18 14:38:09

标签: c# sockets tcp tcpclient

我正在尝试使用TcpClient.BeginConnect与服务器建立aSync连接,但遇到了一些困难。这是我第一次使用Tcp,请耐心等待。

当服务器运行时,连接本身工作正常,我可以毫无问题地发送和接收消息。但是,当我停止服务器并尝试连接到它时,Tcp.BeginConnect将假装它实际连接到服务器而不返回错误,直到我尝试实际发送显然会失败的数据。

当我使用TcpClient.Connect()时,如果几秒钟后没有建立任何连接,它将返回A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.,让我知道连接失败。

有没有办法让TcpClient.BeginConnect获得同样的行为?或者我自己做错了什么?

我环顾四周,发现C# BeginConnect callback is fired when not connected有点类似,答案是在套接字变为可用之前必须在回调中调用EndConnect,但我已经这样做了。

我的代码:

public static void OpenTcpASyncConnection()
{
    if (client == null)
    {
        client = new TcpClient();
        IAsyncResult connection = client.BeginConnect(serverIp, serverPort, new AsyncCallback(ASyncCallBack), client);
        bool succes = connection.AsyncWaitHandle.WaitOne();//returns true
        if (!succes)
        {
            client.Close();
            client.EndConnect(connection);
            throw new Exception("TcpConnection::Failed to connect.");
        }
        else
        {
            Debug.LogFormat("TcpConnection::Connecting to {0} succeeded", serverIp);
        }
    }
    else
    {
        Debug.Log("TcpConnection::Client already exists");
    }
}

public static void ASyncCallBack(IAsyncResult ar)
{
    Debug.Log("Pre EndConnect");
    client.EndConnect(ar);
    Debug.Log("Post EndConnect");//this never gets called?
}

即使服务器处于脱机状态,布尔succes也为真(或者只要操作完成,它总是返回true),因此我认为它认为它实际连接了,{{1} Debug.Log永远不会被调用。不会返回任何错误。

总结;我忘了什么/做错了吗?或者这是预期的行为?

编辑:语言是带有.net 3.5框架的C#。虽然我没有继承monobehaviour,但它是Unity应用程序的功能。如果您需要任何其他信息,我会尝试提供此信息。

亲切的问候和感谢您的时间, 雷米。

0 个答案:

没有答案