远程客户端调用Dispose()之后,仍然能够从TCPClient检索Stream

最大

我有一个简单的客户端/服务器项目,都在本地计算机上运行。

在我的客户项目中,我可以运行以下(简化的)测试代码:

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()对客户打来的电话有基本的误解

彼得·杜尼奥(Peter Duniho)

Dispose()对客户电话有基本的误解吗

您似乎确实如此。

设置一TcpClient()对,其GetStream()被称为处置地方NetworkStream反过来,将该流调用Shutdown()在基础套接字上进行调用,然后关闭该套接字,从而为其释放本地句柄。TcpClient如果尚未创建流,则采取后两个动作。即无论如何,它们将始终发生。)

就这样。没有其他的。

如果您已经(并且已经)在套接字上发送了数据,然后等待了足够长的时间来发送(并且已经)了该数据,那么该数据将不再处于您的控制范围内。实际上,从概念上讲,将其移交给插槽时不再受您的控制。即使在某些情况下,您能够以足够快的速度摆脱套接字以阻止发送数据,也不应指望这一点。而且在实践中,无论本地套接字端发生什么情况,网络驱动程序通常都会非常努力地传输已获得的任何数据。

所以,是的。如果您希望在发送数据后关闭本地套接字会以某种方式影响远程端点是否能够接收您已发送的数据,那么您实际上会对Dispose()调用该方法有根本的误解客户端(本地套接字)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

WildFly:来自远程客户端的EJB调用

来自分类Dev

WildFly:来自远程客户端的EJB调用

来自分类Dev

使用JRMI客户端调用.NET远程功能

来自分类Dev

tcpClient和IRC客户端问题

来自分类Dev

使用TcpClient类的邮件客户端

来自分类Dev

我在GIT中删除了远程分支,但其他客户端仍然看到该分支

来自分类Dev

远程桌面Web客户端

来自分类Dev

Windows IoT远程客户端滞后

来自分类Dev

远程使用 VPN 客户端

来自分类Dev

ClearCase 远程客户端查询

来自分类Dev

C#TcpClient更新(对于IRC客户端)

来自分类Dev

在 :ranch 中检索客户端 IP

来自分类Dev

从客户端检索 Kafka 代理属性

来自分类Dev

如何确定EJB调用是来自远程还是本地客户端

来自分类Dev

WildFly-从远程客户端调用EJB-操作失败,状态为WAITING

来自分类Dev

我可以从远程节点调用 GenServer 客户端功能吗?

来自分类Dev

连接后如何检索出站 Twilio 客户端调用的 SID

来自分类Dev

Java RMI在客户端变量和客户端本身以及服务器的远程调用上具有不同的实例化实例

来自分类Dev

Java RMI在客户端变量和客户端本身以及服务器的远程调用上具有不同的实例化实例

来自分类Dev

Lync客户端SDK PSTN调用

来自分类Dev

隐藏客户端API调用

来自分类Dev

从Web API调用客户端

来自分类Dev

如何限制客户端调用方法?

来自分类Dev

阻止客户端调用JavaScript函数

来自分类Dev

无法从Android客户端调用API

来自分类Dev

NGINX 监听 websocket 客户端的调用

来自分类Dev

从客户端调用云端点库

来自分类Dev

WCF 在客户端调用服务

来自分类Dev

仍然可以使用的YouTube客户端?