TCP / IP:断开连接后立即连接

时间:2014-06-05 23:05:20

标签: c# sockets tcp connection disconnect

我正在通过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;
    }
}

然而,监听连接的服务器没有“听到”客户端的连接尝试:显然,它需要一些时间来从断开连接“恢复”。 现在我的问题是:上述情况是否正常,我确实应该在断开连接和连接之间引入一些延迟?

0 个答案:

没有答案