在意外丢失或崩溃后重新连接到 NamedPipeServerStream
Reconnecting to a NamedPipeServerStream after unexpected loss or crash
我有两个应用程序通过 NamedPipes
相互通信。我们称它们为 appServer
(服务器)和 appClient
(客户端)。他们成功连接并在一段时间内来回发送数据。然后,意外地,appClient
崩溃了。用户重新启动它并尝试连接到管道,但 appServer
仍然认为它已连接,因此没有监听新连接。
我目前在服务器端使用 NamedPipeServerStream
(returns .IsConnected
作为 true
,在客户端使用 NamedPipeClientStream
(NamedPipeClientStream
returns .IsConnected
作为 false
).
我的问题是:我能否以某种方式让客户端能够重新连接?我显然已经尝试 .Connect
有或没有超时但没有运气。
如有任何提示,我们将不胜感激!
谢谢!
编辑:
另一个有效(尽管不受欢迎)的选项是在服务器端执行一些廉价操作,基本上执行 'connection test' 以确保客户端是 'still there'。有人知道其中之一吗?除了发送虚拟消息外,我不确定这样做的最佳方式。我不喜欢这个选项,因为它必须连续发生,但我对所有途径都持开放态度。
我们的解决方案最终是启动等待另一个连接的第二个线程。然后我们比较客户端,如果它是同一个客户端,那么我们关闭并回收原始服务器管道以保持其清洁。
不幸的是,NamedPipeServerStream 在您尝试使用它发送内容之前不会检测到连接已关闭。
最简单的解决方法是定期发送一条短消息,例如特定字节,然后对客户端进行编程以忽略它们。
或者,您可以简单地定期关闭并重新打开两端的连接,这会占用一些资源,但根据您的逻辑可能更容易实现。
我有两个应用程序通过 NamedPipes
相互通信。我们称它们为 appServer
(服务器)和 appClient
(客户端)。他们成功连接并在一段时间内来回发送数据。然后,意外地,appClient
崩溃了。用户重新启动它并尝试连接到管道,但 appServer
仍然认为它已连接,因此没有监听新连接。
我目前在服务器端使用 NamedPipeServerStream
(returns .IsConnected
作为 true
,在客户端使用 NamedPipeClientStream
(NamedPipeClientStream
returns .IsConnected
作为 false
).
我的问题是:我能否以某种方式让客户端能够重新连接?我显然已经尝试 .Connect
有或没有超时但没有运气。
如有任何提示,我们将不胜感激! 谢谢!
编辑: 另一个有效(尽管不受欢迎)的选项是在服务器端执行一些廉价操作,基本上执行 'connection test' 以确保客户端是 'still there'。有人知道其中之一吗?除了发送虚拟消息外,我不确定这样做的最佳方式。我不喜欢这个选项,因为它必须连续发生,但我对所有途径都持开放态度。
我们的解决方案最终是启动等待另一个连接的第二个线程。然后我们比较客户端,如果它是同一个客户端,那么我们关闭并回收原始服务器管道以保持其清洁。
不幸的是,NamedPipeServerStream 在您尝试使用它发送内容之前不会检测到连接已关闭。
最简单的解决方法是定期发送一条短消息,例如特定字节,然后对客户端进行编程以忽略它们。
或者,您可以简单地定期关闭并重新打开两端的连接,这会占用一些资源,但根据您的逻辑可能更容易实现。