管道客户端二次调用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
相关产品推荐
相关产品推荐

