【发布时间】:2018-06-21 04:34:23
【问题描述】:
我是IPC 的菜鸟。我正在尝试将图像帧从我的C++ Server 发送到C# Client。我已经开始了解这一点,并制作了一个小的Client 和Server,其中我的C++ Server 发送Hello。我看到了一个相关的问题,有人告诉我先将Image 转换为Byte Array,然后以与Hello Message 相同的方式发送,但我不能这样做。
我的基本客户端服务器代码
C++ 代码:
Mat image = imread("IMG_0_10_34_45_2018_1.bmp");
uchar buffer[500][500];
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
buffer[i][j] = image.at<unsigned char>(i, j);
}
}
cout << "Server Creating Pipe\n";
HANDLE hPipe = ::CreateNamedPipe(_T("\\\\.\\pipe\\HyperPipe"),
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE,
PIPE_UNLIMITED_INSTANCES,
4096,
4096,
0,
NULL);
cout << "Server Created Succesfully";
ConnectNamedPipe(hPipe, NULL);
cout << "Sending Message to Client";
DWORD bytesWritten = 0;
WriteFile(hPipe, buffer, sizeof(buffer) * sizeof(uchar), &bytesWritten, NULL);
CloseHandle(hPipe);
return 0;
和 C# 代码:
static void Main(string[] args)
{
Console.WriteLine("Creating Client Pipe");
NamedPipeClientStream pipe = new NamedPipeClientStream(".", "HyperPipe", PipeDirection.InOut);
Console.WriteLine("Pipe Created Successfully, Connecting to Server");
pipe.Connect();
Console.WriteLine("Successfully, Connected to Server");
using (StreamReader rdr = new StreamReader(pipe, Encoding.Unicode))
{
System.Console.WriteLine("Message from Server: " + rdr.ReadToEnd());
}
Console.ReadKey();
}
我还注意到,在我的C++ Server 中,我必须更改PIPE_TYPE to BYTE 和READMODE to BYTE。我将OpenCV library 用于Image Processing,所以我可以轻松地使Byte Array 没有问题。
那么,谁能告诉我如何将Byte Array 从C++ 发送到C#。
或者如果可能的话,任何人都可以为我提供代码
提前致谢
更新:
没有错误出现,但在客户端,即C# Side,来自服务器的消息的输出是?????。
【问题讨论】:
-
嗯,可能使用流而不是消息,因为它有点大?
-
是的,先生,我使用的是 BYTE 而不是 MESSAGE,但是如何传输字节数组?
-
不,我的意思是尝试
PIPE_TYPE_BYTE而不是PIPE_TYPE_MESSAGE。对不起,我应该是明确的 -
是的,我已经这样做了
-
太棒了!不要忘记,如果您自己找到了解决方案,请随时将其发布为您自己问题的答案。如果没有更好的答案,您可以接受它作为解决方案,从而获得声誉积分。祝你一切顺利
标签: c# c++ opencv ipc named-pipes