Канал неправильно читает данные - PullRequest
1 голос
/ 07 июля 2019

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», ничего не происходит, а если я затем отправляю «Message2», то ничего не происходит.но если я закрою программу (сторона cpp), она получит «Message1Message2»

1 Ответ

3 голосов
/ 07 июля 2019

ReadLine() ищет последовательность символов конца строки или конец потока перед его возвратом.

Когда ваш код C ++ завершается, канал закрывается и, таким образом, вы видите ReadLine return. Но для отдельных сообщений вы не отправляете последовательность конца строки.

Ссылка на спецификатор типа s для семейства функций scanf():

Строка, до первого пробела (пробел, табуляция или новая строка).

Т.е.. любой вводимый конец строки не включается в отправляемые вами данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...