管道未正确读取数据
Pipe not reading data correctly
C++ 端
hPipe = CreateFile(TEXT((LPTSTR)"\\.\pipe\PIPENAME"), GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
char buf[100];
DWORD cbWritten;
if ((hPipe == NULL || hPipe == INVALID_HANDLE_VALUE))
{
printf("Could not open the pipe - (error %d)\n", GetLastError());
}
else
{
do
{
printf("Enter your message: ");
scanf_s("%s", buf);
WriteFile(hPipe, buf, (DWORD)strlen(buf), &cbWritten, NULL);
memset(buf, 0xCC, 100);
} while (true);
}
memset(buf, 0xCC, 100);
这就是我尝试将数据发送到我的 c# 程序的方面
这是 C# 代码
using (var pipeServer = new NamedPipeServerStream("PIPENAME", PipeDirection.InOut))
{
using (var reader = new StreamReader(pipeServer))
{
using (var writer = new StreamWriter(pipeServer))
{
var running = true;
MessageBox.Show("Server is waiting for a client");
pipeServer.WaitForConnection();
MessageBox.Show("Server: Prompting for Input");
writer.Flush();
while (running)
{
//pipeServer.WaitForPipeDrain();
var message = reader.ReadToEnd();
MessageBox.Show("Received message: " + message);
if (message.Equals("quit"))
{
writer.WriteLine("quit");
running = false;
}
}
}
}
}
Console.WriteLine("Server Quits");
我也尝试过使用 ReadLine,但它一直在读取,直到我关闭 C++ 管道端
基本上我正在尝试从 C++ 端发送消息,例如 "Message1"
而 c# 端必须读取它。
但是当我发送消息 "Message1" 时 atm 没有任何反应,如果我随后发送 "Message2" 也没有任何反应。但如果我关闭程序(cpp 端),它将收到 "Message1Message2"
ReadLine()
正在寻找 end-of-line 字符序列,或流的结尾,在 returns.
之前
当您的 C++ 代码退出时,管道关闭,因此您会看到 ReadLine
return。但是对于单独的消息,您发送的不是 end-of-line 序列。
为 scanf()
函数系列引用 s
type specifier:
String, up to first white-space character (space, tab or newline).
即。您发送的数据中不包含任何输入 end-of-line。
C++ 端
hPipe = CreateFile(TEXT((LPTSTR)"\\.\pipe\PIPENAME"), GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
char buf[100];
DWORD cbWritten;
if ((hPipe == NULL || hPipe == INVALID_HANDLE_VALUE))
{
printf("Could not open the pipe - (error %d)\n", GetLastError());
}
else
{
do
{
printf("Enter your message: ");
scanf_s("%s", buf);
WriteFile(hPipe, buf, (DWORD)strlen(buf), &cbWritten, NULL);
memset(buf, 0xCC, 100);
} while (true);
}
memset(buf, 0xCC, 100);
这就是我尝试将数据发送到我的 c# 程序的方面 这是 C# 代码
using (var pipeServer = new NamedPipeServerStream("PIPENAME", PipeDirection.InOut))
{
using (var reader = new StreamReader(pipeServer))
{
using (var writer = new StreamWriter(pipeServer))
{
var running = true;
MessageBox.Show("Server is waiting for a client");
pipeServer.WaitForConnection();
MessageBox.Show("Server: Prompting for Input");
writer.Flush();
while (running)
{
//pipeServer.WaitForPipeDrain();
var message = reader.ReadToEnd();
MessageBox.Show("Received message: " + message);
if (message.Equals("quit"))
{
writer.WriteLine("quit");
running = false;
}
}
}
}
}
Console.WriteLine("Server Quits");
我也尝试过使用 ReadLine,但它一直在读取,直到我关闭 C++ 管道端
基本上我正在尝试从 C++ 端发送消息,例如 "Message1" 而 c# 端必须读取它。
但是当我发送消息 "Message1" 时 atm 没有任何反应,如果我随后发送 "Message2" 也没有任何反应。但如果我关闭程序(cpp 端),它将收到 "Message1Message2"
ReadLine()
正在寻找 end-of-line 字符序列,或流的结尾,在 returns.
当您的 C++ 代码退出时,管道关闭,因此您会看到 ReadLine
return。但是对于单独的消息,您发送的不是 end-of-line 序列。
为 scanf()
函数系列引用 s
type specifier:
String, up to first white-space character (space, tab or newline).
即。您发送的数据中不包含任何输入 end-of-line。