【发布时间】:2012-03-29 09:35:57
【问题描述】:
我正在尝试开始使用命名管道,因为我将来需要将它们用于我的项目。
目前我有一个 C++ 服务器,它一直等到客户端连接并通过测试消息发送。我大致按照这个tutorial 开始。相关代码如下:
#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");
}
}
目前我已经让客户端成功连接到服务器并打印出第一个字节。我想知道如何做两件事:
阅读整个消息 - 我尝试在 pipeClient 上使用 StreamReader 来阅读消息,但它无限期地挂在 ReadLine() 上。
连续发送消息 - 我希望服务器将消息一个接一个地发送到客户端,客户端将一次读取它们并打印出来。我对 IPC 有点一无所知,所以起初我试图让客户端断开连接并在 while(true) 循环中重新连接到服务器,而服务器处于 while true 循环中,它在顶部总是等待新的客户端连接之前发送另一条消息。我的尝试是在上面的代码中。
对此的任何帮助将不胜感激。最终目标是通过图像从服务器发送到客户端。然后客户端将它们实时打印到屏幕上。在我尝试图像数据之前,我想用简单的字符串消息来解决这个问题。
编辑:
最终我希望能够从客户端向服务器发送一条消息,表明它想要获取最新的图像帧,然后服务器将发送最新的帧,然后客户端将显示在屏幕上。所以流程是:
- Client -> Server : 客户端需要最新帧信息的指示符。 (很简单,可能是一个值为 1 的无符号整数)
- 服务器 -> 客户端:最新帧信息。 (以 RGB 字节值存储在字节数组中的 640x480 图像)
- 客户端:在显示器上显示框架。
【问题讨论】:
-
对于您的第一个问题,请使用
StreamReader之类的内容(仅当您的消息是文本时才使用此选项)。StreamReader.ReadToEnd将从流中读取所有可用数据。 -
嗨,我试过了,但它会等到 C++ 服务器关闭后,才会一次打印出所有消息。最终,我希望能够从客户端向服务器发送一条消息,表明它想要获取最新的图像帧,然后服务器将发送最新的帧,然后客户端将显示在屏幕上。
标签: c# c++ windows ipc named-pipes