我以一个简单的客户端服务器管道示例为例。服务器将使用命名管道从客户端接收字符串。服务器将从客户端收到的字符串中的每个字符的大小写颠倒,并使用管道将字符串发送回客户端。它可以工作,但是我写到管道的字符串似乎被空格分开了。附有一张图像,显示了我的问题。
我在服务器上创建一个这样的命名管道。
HANDLE pipe_handle = CreateNamedPipe(
PIPE_REV_NAME, //name
PIPE_ACCESS_DUPLEX, //openMode
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, //Pipe Mode
1,//Max Instances
1024,//OutBuffSize
1024,//InBuffSize
NMPWAIT_USE_DEFAULT_WAIT,
NULL);
像这样在服务器上读写数据:
DWORD bytes_read;
ReadFile(
pipe_handle,
(LPVOID)string_to_reverse,
MAX_PIPE_REVLEN - 1,
&bytes_read,
NULL);
string_to_reverse[bytes_read] = '\0';
printf("Recieved: %s\n", string_to_reverse);
cap_reverse(string_to_reverse, bytes_read);
printf("Sending: %s\n", string_to_reverse);
DWORD bytes_written;
WriteFile(
pipe_handle,
(LPVOID)string_to_reverse,
bytes_read,
&bytes_written,
NULL);
客户端创建文件以使用管道,如下所示:
HANDLE pipe_handle = CreateFile(
PIPE_REV_NAME,
GENERIC_READ | GENERIC_WRITE,
0, // no sharing
NULL, // default security attributes
OPEN_EXISTING, // opens existing pipe
0, // default attributes
NULL
);
像这样对管道进行读写:
strncpy_s(buff, toReverse.c_str(), MAX_PIPE_REVLEN - 1);
printf("Sending: %s\n", buff);
WriteFile(
pipe_handle,
(LPVOID)buff,
toReverse.length(),
&bytes_written,
NULL);
printf("Waiting\n");
DWORD bytes_read = 0;
ReadFile(
pipe_handle,
(LPVOID)buff,
toReverse.length(),
&bytes_read,
NULL);
答案 0 :(得分:4)
这与管道无关。
从屏幕截图中我们可以看到,是您的 client 一次处理了您的输入一个单词。 (请注意每个单词的重复“发送:”。)
您没有向我们展示该代码,甚至没有向我们展示一个最小的可复制示例,但是我可以告诉您您做了类似的事情:
std::string input;
if (std::cin >> input)
{
// send to pipe
}
不要。而是这样做:
std::string input;
if (std::getline(std::cin, input))
{
// send to pipe
}
参考文献: