客户端断开连接后在 .NET 4 中重用 NamedPipeServerStream 时 BeginWaitForConnection 引发的异常

Posted

技术标签:

【中文标题】客户端断开连接后在 .NET 4 中重用 NamedPipeServerStream 时 BeginWaitForConnection 引发的异常【英文标题】:Exception thrown by BeginWaitForConnection when reusing a NamedPipeServerStream in .NET 4 after client disconnects 【发布时间】:2011-05-18 13:43:45 【问题描述】:

我正在尝试使用 NamedPipeServerStream 在 .Net 4 中创建命名管道服务器。我正在使用 BeginWaitForConnection 等待连接,以便在服务器关闭时中止等待下来。

对于第一个客户端来说一切正常 --- 连接被确认,数据被接收,响应被发送 OK。但是,在客户端断开连接后,一切都会中断。我再次打电话给BeginWaitForConnection 以等待新的连接,但这是抛出一个IOException 说“管道坏了”。

如何在同一管道上等待第二个客户端?

【问题讨论】:

【参考方案1】:

创建一个NamedPipeServerStream 的新实例,指定相同的管道,然后调用BeginWaitForConnection

即不要尝试为不同的客户端重用 NamedPipeServerStream 对象:一个实例应该服务于一个客户端连接/对话,然后被释放。

另见Multithreaded NamePipeServer in C#

【讨论】:

【参考方案2】:

使用单个客户端/服务器配置时的另一种方法是在客户端断开连接以清理管道时Disconnect 管道流。这允许重复使用管道。当您再次调用BeginWaitForConnection 时,它将开始接受连接。

while (true) 

    pipe.BeginWaitForConnection();
    // read and write to pipe
    // catch exception when client disconnects
    pipe.Disconnect();

【讨论】:

您还必须小心不要处置/关闭与命名管道流一起使用的流读取器/写入器,因为它们将关闭基础流,然后就无法重用。

以上是关于客户端断开连接后在 .NET 4 中重用 NamedPipeServerStream 时 BeginWaitForConnection 引发的异常的主要内容,如果未能解决你的问题,请参考以下文章

vb2010 (vb.net )Socket套接字当网络中断时或服务器意外关机,客户端如何自动重新连接服务端

什么可能导致“客户端断开连接”ASP.NET 异常?

TCP连接的状态

如何确定与 SignalR 客户端的服务器断开连接?

45.TCP四次挥手断开连接的过程

45.TCP四次挥手断开连接的过程