在命名管道服务器上崩溃客户端并随后重新连接

时间:2017-09-09 16:50:28

标签: c# ipc

晚上,

我写这篇文章时意识到我在命名管道服务器/客户端架构方面缺乏一点基本的理解,并希望有人可以帮助我。我的目标是拥有一个客户端可以连接的服务器应用程序,并且在客户端崩溃的情况下,重新启动客户端应用程序将允许重新连接到服务器。两个应用程序都在同一台机器上运行。

以下场景:我有一个打开命名管道服务器的应用程序/程序,如此

// 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
}

我可以运行此连接并且它可以正常运行。有趣的是,当运行客户端的应用程序崩溃时。重新启动该应用程序后,客户端无法重新连接到服务器。

在我找到的解决方案中,我真的无法理解他们是否以及如何解决我的问题。我的理解是服务器对象可以接受一个或多个传入客户端,并发送和接收来自所有客户端的消息。因此,如果我的客户端崩溃,我只需重新启动它,它就可以连接并注册为新客户端。但它似乎没有这样的方式。

0 个答案:

没有答案