我正在通过TCP / IP开发客户端和服务器协议。它完全是异步的 - 即它分别使用TcpClient
的方法ConnectAsync/Close/ReadAsync/WriteAsync
来连接/断开/读/写。
我的GUI有连接和断开按钮。 “连接”按钮断开连接,然后立即连接:
Disconnect();
Connect();
“断开连接”按钮仅断开连接:
Disconnect();
场景1:按连接。 方案2:按“断开”,然后按“连接”。 我面临的问题是场景1正式断开连接,但只有在我添加大约100毫秒的延迟后才连接:
Disconnect();
Thread.Sleep(100);
Connect();
第二种情况总是有效的,这当然是预期的,因为“手动”延迟将远远超过100ms。
连接代码调用TcpClient.ConnectAsync()
,并等待任务完成。
任务正常完成;完成后我还会检查其他3件事:
Debug.Assert(TcpClient.Connected);
Debug.Assert(TcpClient.Client.Connected);
Debug.Assert(IsConnected(TcpClient.Client));
…
bool IsConnected(TcpClient.Client) // fairly well-known way to check a connection
{
bool blockingState = client.Blocking;
try
{
var bytes = new byte[1];
client.Blocking = false;
var bytesSent = client.Send(bytes, 0, 0);
return true;
}
catch (SocketException e)
{
// 10035 == WSAEWOULDBLOCK
if (e.NativeErrorCode.Equals(10035))
return true;
else
{
return false;
}
}
finally
{
client.Blocking = blockingState;
}
}
然而,监听连接的服务器没有“听到”客户端的连接尝试:显然,它需要一些时间来从断开连接“恢复”。 现在我的问题是:上述情况是否正常,我确实应该在断开连接和连接之间引入一些延迟?