阻塞管道连接命名管道不触发
Blocking pipe ConnectNamedPipe does not trigger
我想使用命名管道进行IPC。 这是我尝试在两个进程之间进行通信的测试客户端/服务器 客户端代码:
#include <iostream>
#include <Windows.h>
int main()
{
HANDLE pipe = CreateFileA("\\.\pipe\DokiDoki", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (pipe != INVALID_HANDLE_VALUE) {
char buffer[] = "DokiDoki from the other side :P";
DWORD bytesWritten;
WriteFile(pipe, static_cast<LPCVOID>(buffer), sizeof(buffer), &bytesWritten, NULL);
std::cout << "Done!n";
CloseHandle(pipe);
}
else {
std::cout << "Could not get a handle to the pipe!n";
return 1;
}
return 0;
}
服务器代码:
#include <iostream>
#include <array>
#include <Windows.h>
int main()
{
char buffer[1024];
HANDLE pipe = CreateNamedPipeA("\\.\pipe\DokiDoki", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, sizeof(buffer), sizeof(buffer), NMPWAIT_USE_DEFAULT_WAIT, NULL);
while (pipe != INVALID_HANDLE_VALUE) {
if (!ConnectNamedPipe(pipe, NULL)) {
//Setting a breakpoint here will never trigger.
DWORD bytesRead = 0;
while (ReadFile(pipe, static_cast<LPVOID>(buffer), sizeof(buffer) - 1, &bytesRead, NULL)) {
std::cout << buffer << std::endl;
}
}
DisconnectNamedPipe(pipe);
}
return 0;
}
程序在 ConnectNamedPipe 停止,并且不会执行任何其他指令,即使客户端连接并写入管道也是如此。 写文件(在客户端上(返回 true。
如果成功,ConnectNamedPipe会返回一个非零值,这就是它不起作用的原因。 将if (!ConnectNamedPipe(pipe, NULL))
更改为if (ConnectNamedPipe(pipe, NULL))
似乎工作正常。
相关文章:
- 在没有管理员权限的情况下连接到同一网络中的命名管道
- 阻塞管道连接命名管道不触发
- 使用提升连接已创建的命名管道
- range-v3:将管道范围与分律器连接起来
- 命名管道无法再次连接
- 如何知道何时有最大数量的命名管道客户端与服务的连接?
- C#C++命名管道连接
- MySQL Windows c api 命名管道错误:"在'等待初始通信数据包'时丢失与 MySQL 服务器的连接,系统错误:0
- 为什么 read() 在管道连接到使用 boost::asio for STDIN/STDOUT 的程序时,使用 EAG
- 连接到子进程stdout的管道中的消息不完整
- 命名管道:连接命名管道返回ERROR_BROKEN_PIPE后的读取文件
- 从 c++ 到 Java 行的命名管道连接,每个字符之间有空格
- 无法连接到命名管道
- 具有IP地址的命名管道连接
- boost asio async_write未在断开连接的客户端上生成管道破裂或其他错误
- 从Ada程序到C++程序的管道连接
- 使用c#,如何连接到一个单向的c++命名管道
- 命名管道在后台等待客户端,直到客户端连接
- 如何执行和写入stdin并将stdout管道连接到套接字
- 从 C++ win32 程序连接到命名管道时出现问题