为什么我的NamedPipe用空格分隔我的字符串?

时间:2019-07-18 16:45:45

标签: c++ operating-system pipe

我以一个简单的客户端服务器管道示例为例。服务器将使用命名管道从客户端接收字符串。服务器将从客户端收到的字符串中的每个字符的大小写颠倒,并使用管道将字符串发送回客户端。它可以工作,但是我写到管道的字符串似乎被空格分开了。附有一张图像,显示了我的问题。

我在服务器上创建一个这样的命名管道。

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);

The Output of the client and server

1 个答案:

答案 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
}

参考文献: