我有一个简单的客户端/服务器项目,都在本地计算机上运行。
在我的客户项目中,我可以运行以下(简化的)测试代码:
using(var tcpClient = new System.Net.Sockets.TCPClient())
{
tcpClient.ConnectAsync(host, port).Wait(Timespan.FromSeconds(3));
using (NetworkStream ns = tcpClient.GetStream())
{
ns.Write("Hello World", 0, "Hello World".Length);
Thread.Sleep(100);
}
}
这应该在流中写入“ Hello World”,然后在约100ms之后处理所有内容,因此在此之后使其变得不可读。
问题是,TcpListener
在我的服务器项目中运行,可以大致执行以下操作:
TcpClient client = TcpListener.AcceptTcpClient();
Thread.Sleep(750);
var stream = client.GetStream(); //I am still able to read the contents of this - shouldnt it be closed?
这可能是由于在同一台计算机上运行客户端/服务器引起的问题吗?还是我Dispose()
对客户打来的电话有基本的误解。
我
Dispose()
对客户的电话有基本的误解吗?
您似乎确实如此。
设置一TcpClient()
对,其GetStream()
被称为处置地方NetworkStream
。反过来,将该流调用Shutdown()
在基础套接字上进行调用,然后关闭该套接字,从而为其释放本地句柄。(TcpClient
如果尚未创建流,则采取后两个动作。即无论如何,它们将始终发生。)
就这样。没有其他的。
如果您已经(并且已经)在套接字上发送了数据,然后等待了足够长的时间来发送(并且已经)了该数据,那么该数据将不再处于您的控制范围内。实际上,从概念上讲,将其移交给插槽时不再受您的控制。即使在某些情况下,您能够以足够快的速度摆脱套接字以阻止发送数据,也不应指望这一点。而且在实践中,无论本地套接字端发生什么情况,网络驱动程序通常都会非常努力地传输已获得的任何数据。
所以,是的。如果您希望在发送数据后关闭本地套接字会以某种方式影响远程端点是否能够接收您已发送的数据,那么您实际上会对Dispose()
调用该方法有根本的误解客户端(本地套接字)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句