我正在尝试开始使用命名管道,因为将来我的项目需要使用它们。
目前我有一个C++服务器等待客户端连接并发送测试消息。我大致遵循了这个教程来入门。相关代码如下:
#define MESSAGE L"TestMessage"
HANDLE hnamedPipe = INVALID_HANDLE_VALUE;
hnamedPipe = CreateNamedPipe(
L"\\\\.\\pipe\\testpipe",
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE|
PIPE_READMODE_MESSAGE|
PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
1024,
1024,
NMPWAIT_USE_DEFAULT_WAIT,
NULL);
if(hnamedPipe == INVALID_HANDLE_VALUE)
{
cout << "Failed" << endl;
}
while(true)
{
cout<< "Waiting for client"<< endl;
if(!ConnectNamedPipe(hnamedPipe,NULL))
{
if(ERROR_PIPE_CONNECTED != GetLastError())
{
cout << "FAIL"<< endl;
}
}
cout<<"Connected!"<<endl;
//Send over the message
wchar_t chResponse[] = MESSAGE;
DWORD cbResponse,cbWritten;
cbResponse = sizeof(chResponse);
if(!WriteFile(
hnamedPipe,
chResponse,
cbResponse,
&cbWritten,
NULL))
{
wprintf(L"failiure w/err 0x%08lx\n",GetLastError);
}
cout<<"Sent bytes :)" << endl;
}
客户端代码(C#)如下:
using (NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "testpipe", PipeDirection.InOut))
{
while (true)
{
Console.WriteLine("Connecting to server...");
pipeClient.Connect();
Console.WriteLine("Connected :)");
Console.WriteLine(pipeClient.ReadByte());
pipeClient.Close();
Console.WriteLine("Closed");
}
}
目前我已经成功地使客户端连接到服务器并打印出第一个字节。我想知道如何做两个事情:
- 读取整个消息 - 我尝试使用StreamReader在pipeClient上读取消息,但它会无限期地挂起在ReadLine()。
- 连续发送消息 - 我希望服务器将一个接一个地向客户端发送消息,客户端将逐一读取并打印它们。我对IPC一知半解,所以一开始我尝试让客户端在while(true)循环中断开并重新连接到服务器,而服务器则在while true循环中等待新的客户端连接才会在顶部发送另一条消息。我的尝试在上面的代码中。
编辑:
最终,我希望能够从客户端向服务器发送消息,指示它想要获取最新的图像帧,然后服务器将发送最新的帧,客户端将在屏幕上显示它们。因此流程如下:
- 客户端 -> 服务器: 指示客户端想要获取最新的帧信息。(某些简单内容,可能是具有值1的无符号整数)
- 服务器 -> 客户端: 最新的帧信息。(640x480图像存储在带有RGB字节值的字节数组中)
- 客户端: 在显示器上显示帧。
StreamReader
的东西(只有在你的消息是文本时才使用)。StreamReader.ReadToEnd
将从流中读取所有可用数据。 - M.Babcock