TcpClient.Close不关闭连接

我有一个使用的TcpClient和的TcpListener通过网络通信的应用程序。 然而,当我打电话TcpClient.Close在客户端与服务器断开连接,服务器没有反应的。

现在,您询问这个问题是这一个的副本,以及如何该解决方案可以在这里找到一个注释之前,相信我,当我说我已经找到了这些,并尝试过。 它并不能帮助。 我也尝试不同的组合TcpClient.CloseTcpClient.GetStream().Close()TcpClient.Dispose 。 没有什么作品。

代码是什么值得注意的是,只在该复位所有的变量重用的客户端断开的方法,并关闭所有网络资源。 该服务器有一个循环,检查是否TcpClient.Connected是真还是假,如果是假的,它应该跳出循环,并终止线程。

有任何想法吗?

--------------解决方案-------------

TcpClient.Connected应该几乎被忽 ​​略。 它基本上代表了最后的通信是否成功。 从MSDN(重点煤矿):

因为连接的属性只反映了连接的最近操作的状态下,你应该尝试发送或接收消息,以确定当前状态。 消息发送失败后,此属性不再返回true。 请注意,此行为是设计使然。 不能可靠地测试连接的状态,因为,在测试和一个发送之间的时间/接收器,则连接可能已经丢失。 您的代码应承担套接字连接,并适当地处理失败的传输。

如果调用Close()在客户端上,没有什么是发送到服务器,告诉它,它的结束,它真的只是关闭它的自我,这样客户端无法使用它了。 唯一可靠的方法来确定,如果你仍然连接是试图发送数据并处理故障。 如果你愿意,你可以实现自己的握手协议,当你调用,其中Close()您发送到服务器时,它提醒一个事实,一个特殊的通知,但仍会出现时包永远不会到达服务器的时间。

倾听一个字节,如果它收到,得到休息。 如果接收一个字节返回0,客户端断开。

IPAddress nReceiveAddress = IPAddress.Parse(GetIp(sSource));
IPEndPoint localEndPoint = new IPEndPoint(nReceiveAddress, GetPort(sSource));
Socket nSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
nSocket.Bind(localEndPoint);

nSocket.Listen(10);
Socket nSocketClient = nSocket.Accept();

byte[] bufferOne = new byte[1];
int nBytes = nClient.Receive(bufferOne);

if (nBytes == 0)
{
AppendToLog(String.Format("{0}: Closing.", sName));
nClient.Close();
}
else
{
byte[] buffer = null;
buffer = new byte[nClient.Available + 1];

if (nClient.Available > 0)
nBytes = nClient.Receive(buffer);

if(nBytes>0)
{
//KS effectively insert the first received byte at start.
Array.Copy(buffer, 0, buffer, 1, buffer.Length - 1);
buffer[0] = bufferOne[0];
}
}

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#,网络,TcpClient的
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.673 (s). 10 q(s)