我试图断开客户端与服务器的连接,但服务器仍然认为它正在连接。我无法找到解决方案,关机,断开和关闭所有不工作。断开TCPClient,并看到另一侧
来自客户端的我断开一些代码,检查服务器上:
客户:
private void btnDisconnect_Click(object sender, EventArgs e)
{
connTemp.Client.Shutdown(SocketShutdown.Both);
connTemp.Client.Disconnect(false);
connTemp.GetStream().Close();
connTemp.Close();
}
服务器:
while (client != null && client.Connected)
{
NetworkStream stream = client.GetStream();
data = null;
try
{
if (stream.DataAvailable)
{
data = ReadStringFromClient(client, stream);
WriteToConsole("Received Command: " + data);
}
} // So on and so on...
还有更多的写入,并在进一步往下读码。
希望大家能帮忙。
更新:我甚至试图通过ref传递TCP客户端,假设有一个范围问题和客户端。即使读取后,连接保持为真。出了什么问题?
第二次更新!!:
下面是解决方案。做一个偷看并基于此,确定你是否连接。
if (client.Client.Poll(0, SelectMode.SelectRead))
{
byte[] checkConn = new byte[1];
if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0)
{
throw new IOException();
}
}
太可怕了,不是吗?客户端不会告诉服务器它已断开连接。如果服务器真的需要知道,它可以轮询套接字或尝试定期写入套接字。当然,客户需要了解并正确处理这些心跳。 – 2010-09-23 21:00:06
轮询是不够的(“没有数据 - >没有问题”的原则)。你需要写一个套接字来确定它是关闭的。 – Bruno 2010-09-23 21:11:32
哇。有没有更简单的解决方案? – 2010-09-23 21:27:46