我正在尝试在C++(Windows)中创建两个进程之间的简单通信,就像Linux中的FIFO一样。
这是我的服务器:
这是我的客户:
代码不起作用。我该如何修复它,使其像FIFO一样工作?
这是我的服务器:
int main()
{
HANDLE pipe = CreateFile(TEXT("\\\\.\\pipe\\Pipe"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
ConnectNamedPipe(pipe, NULL);
while(TRUE){
string data;
DWORD numRead =1 ;
ReadFile(pipe, &data, 1024, &numRead, NULL);
cout << data << endl;
}
CloseHandle(pipe);
return 0;
}
这是我的客户:
int main()
{
HANDLE pipe = CreateFile(TEXT("\\\\.\\pipe\\Pipe"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
ConnectNamedPipe(pipe, NULL);
string message = "TEST";
DWORD numWritten;
WriteFile(pipe, message.c_str(), message.length(), &numWritten, NULL);
return 0;
}
代码不起作用。我该如何修复它,使其像FIFO一样工作?
FILE_FLAG_FIRST_PIPE_INSTANCE
:'FILE_FLAG_FIRST_PIPE_INSTANCE' 在此范围内未声明,但我已经在 MSDN 上阅读过,这里不应该有任何错误。 - user3052078ReadFile(..)
读取数据(= 客户端的 5x WriteFile!= 服务器的 5x ReadFile)。因此,如果客户端发送的字符串包含 '\0' 字符,则此示例中的简单printf("%s",buffer);
不起作用,因为 printf 在遇到第一个 '\0' 时停止。 - Lukas ThomsenCreateFile
在失败时会返回INVALID_HANDLE_VALUE
。而INVALID_HANDLE_VALUE != NULL
。 - David HeffernanCreateNamedPipe
成功,外层循环将永远不会退出。即使调用了DisconnectNamedPipe
,hPipe
的值也没有改变。不过,这是一个人们可以学习的好例子。 - Doug Cuthbertson