我编写了使用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");
}
答案 0 :(得分:1)
TCP是一种面向连接的协议,但连接仍然是虚拟连接 - 了解另一方仍然连接的唯一方法是成功发送或接收消息它。这就是Connected
属性可能产生误报的原因。
0字节消息表示客户端已发送所有数据并已关闭(发送方向)套接字。此时客户端仍然连接,等待从服务器返回的0字节消息(当您关闭服务器套接字时会自动发送)。
当然,如果网络出现故障,您将永远不会收到该0字节的消息,但您最终会收到SocketException
。
有关关闭过程的详细信息,请参阅此WinSock FAQ。