我正在尝试使用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应用程序的功能。如果您需要任何其他信息,我会尝试提供此信息。
亲切的问候和感谢您的时间, 雷米。