晚上,
我写这篇文章时意识到我在命名管道服务器/客户端架构方面缺乏一点基本的理解,并希望有人可以帮助我。我的目标是拥有一个客户端可以连接的服务器应用程序,并且在客户端崩溃的情况下,重新启动客户端应用程序将允许重新连接到服务器。两个应用程序都在同一台机器上运行。
以下场景:我有一个打开命名管道服务器的应用程序/程序,如此
// Provide full access to the current user so more pipe instances can be created
PipeSecurity m_ps = new PipeSecurity();
m_ps.AddAccessRule(
new PipeAccessRule(WindowsIdentity.GetCurrent().User, PipeAccessRights.FullControl,
AccessControlType.Allow)
);
m_ps.AddAccessRule(
new PipeAccessRule(
new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null),
PipeAccessRights.ReadWrite, AccessControlType.Allow
)
);
/// Init the pipe
LauncherPipeServer = new NamedPipeServerStream("CommandPipe",
PipeDirection.In,
1000,
PipeTransmissionMode.Message,
PipeOptions.Asynchronous,
1,
1,
m_ps);
在这个程序的一个单独的线程中,我等待来自客户端的连接
...
LauncherPipeServerWorker = new System.ComponentModel.BackgroundWorker();
LauncherPipeServerWorker.DoWork += ServerPipeHandling_DoWork;
LauncherPipeServerWorker.RunWorkerAsync();
private void ServerPipeHandling_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
//...
LauncherPipeServer.WaitForConnection();
/// React to incoming messages
}
我可以运行此连接并且它可以正常运行。有趣的是,当运行客户端的应用程序崩溃时。重新启动该应用程序后,客户端无法重新连接到服务器。
在我找到的解决方案中,我真的无法理解他们是否以及如何解决我的问题。我的理解是服务器对象可以接受一个或多个传入客户端,并发送和接收来自所有客户端的消息。因此,如果我的客户端崩溃,我只需重新启动它,它就可以连接并注册为新客户端。但它似乎没有这样的方式。