如何知道客户端调用连接是否关闭TcpListener?

时间:2015-04-13 06:16:05

标签: c#

我编写了使用TcpListener的简单应用程序。 应用程序等待一些客户端连接 - 当客户端连接时,应用程序将监听他的发送流。

在代码中 - 我使用while循环来检查客户端是否已连接。 但是当我在客户端关闭连接的事件我得到连接== true

但..在客户端关闭=>我看到服务器使用byte.length == 0

获取字节流

代码......

private async void button1_Click(object sender, EventArgs e)
{
        TcpListener tcpListener = new TcpListener(IPAddress.Any, 5501);
        tcpListener.Start(1);       // listen one client only

        TcpClient client = await tcpListener.AcceptTcpClientAsync();

        NetworkStream networkStream = client.GetStream();

        while (client.Connected)    // after connected => this is always true .. event if i close the connection on the client side 
        {
            // do something ... 
        }

        System.Console.WriteLine("No Connected");
}

1 个答案:

答案 0 :(得分:1)

TCP是一种面向连接协议,但连接仍然是虚拟连接 - 了解另一方仍然连接的唯一方法是成功发送或接收消息它。这就是Connected属性可能产生误报的原因。

0字节消息表示客户端已发送所有数据并已关闭(发送方向)套接字。此时客户端仍然连接,等待从服务器返回的0字节消息(当您关闭服务器套接字时会自动发送)。

当然,如果网络出现故障,您将永远不会收到该0字节的消息,但您最终会收到SocketException

有关关闭过程的详细信息,请参阅此WinSock FAQ