You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

管道客户端二次调用CreateFile失败,错误码231(ERROR_PIPE_BUSY)问题求助

管道客户端二次调用CreateFile失败,错误码231(ERROR_PIPE_BUSY)问题求助

各位大佬好,我现在卡在一个命名管道的问题上了,折腾好久没搞定,来求助大家!

我的需求是让两个DLL互相通信:一个作为管道服务器,在程序运行期间保持活跃;另一个作为管道客户端,可以在任意时机断开并重新连接,而服务器始终保持运行状态。

先贴一下我的相关代码:

DLL1(管道服务器)

void DLL1_Begin() // 程序启动时仅调用一次
{
    g_hPipeServer = CreateNamedPipe(TEXT("\\\\.\\pipe\\MyPipe123"),
        PIPE_ACCESS_DUPLEX,
        PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_NOWAIT,
        1,
        4,
        4,
        NMPWAIT_USE_DEFAULT_WAIT,
        NULL);

    if (g_hPipeServer == INVALID_HANDLE_VALUE)
    {
        char error[256];
        sprintf_s(error, "Server pipe error %lu", GetLastError());
        MessageBox(NULL, error, "Fatal error", MB_OK | MB_ICONERROR);
        exit(1);
    }

    ConnectNamedPipe(g_hPipeServer, NULL);
}

void DLL1_End() // 程序关闭时仅调用一次
{
    DisconnectNamedPipe(g_hPipeServer);
    CloseHandle(g_hPipeServer);
}

DLL2(管道客户端)

注:DLL2和程序一起初始化,会一直附着在程序进程中;下面这两个函数是偶尔被调用的,专门用于管道操作。

void DLL2_InitPipeClient()
{
    g_hClientPipe = CreateFile(TEXT("\\\\.\\pipe\\MyPipe123"),
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        0,
        NULL);

    if (g_hClientPipe == INVALID_HANDLE_VALUE) // 这里是问题出现的地方
    {
        char error[256];
        sprintf_s(error, "Client pipe error %lu", GetLastError());
        MessageBox(NULL, error, "Fatal error", MB_OK | MB_ICONERROR);
        exit(1);
    }
}

void DLL2_EndPipeClient()
{
    CloseHandle(g_hClientPipe);
    g_hClientPipe = NULL;
}

操作流程

  • 程序启动,DLL1加载,调用DLL1_Begin()
  • 用户点击某个按钮,DLL2加载(之后一直附着),调用DLL2_InitPipeClient(),这时候通信是正常的,可以双向传输数据
  • 用户点击另一个按钮,先调用DLL2_EndPipeClient(),紧接着立刻调用DLL2_InitPipeClient()

问题现象

第二次调用DLL2_InitPipeClient()时,CreateFile返回INVALID_HANDLE_VALUE,错误码是231(也就是ERROR_PIPE_BUSY)。我需要让用户能随时重启客户端管道,但现在就是做不到。

已尝试的方案

  • 我知道同一时间只能有一个客户端连接,所以试过把CreateNamedPipe的maxinstances参数设得更大,但没用,还是报同样的错误
  • 客户端调用CloseHandle总是返回成功,但之后再创建客户端管道就失败

想请教大家:为什么服务器管道会处于繁忙状态?怎么修改才能让客户端可以随时断开并重新连接?

备注:内容来源于stack exchange,提问作者IOviSpot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:18:10