Блокировка канала ConnectNamedPipe не запускается - PullRequest
0 голосов
/ 29 мая 2020

Я хочу использовать IP C с использованием именованных каналов. Вот тестовый клиент / сервер, который я попытался создать для связи между двумя процессами Код клиента:

#include <iostream>
#include <Windows.h>

int main()
{
    HANDLE pipe = CreateFileA("\\\\.\\pipe\\DokiDoki", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (pipe != INVALID_HANDLE_VALUE) {
        char buffer[] = "DokiDoki from the other side :P";
        DWORD bytesWritten;
        WriteFile(pipe, static_cast<LPCVOID>(buffer), sizeof(buffer), &bytesWritten, NULL);
        std::cout << "Done!\n";
        CloseHandle(pipe);
    }
    else {
        std::cout << "Could not get a handle to the pipe!\n";
        return 1;
    }
    return 0;
}

Код сервера:

#include <iostream>
#include <array>
#include <Windows.h>

int main()
{
    char buffer[1024];
    HANDLE pipe = CreateNamedPipeA("\\\\.\\pipe\\DokiDoki", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, sizeof(buffer), sizeof(buffer), NMPWAIT_USE_DEFAULT_WAIT, NULL);
    while (pipe != INVALID_HANDLE_VALUE) {
        if (!ConnectNamedPipe(pipe, NULL)) {
         //Setting a breakpoint here will never trigger.
            DWORD bytesRead = 0;    
            while (ReadFile(pipe, static_cast<LPVOID>(buffer), sizeof(buffer) - 1, &bytesRead, NULL)) {
                std::cout << buffer << std::endl;
            }
        }
        DisconnectNamedPipe(pipe);
    }
    return 0;
}

Программа останавливается на ConnectNamedPipe и не будет выполняться любые другие инструкции, даже когда клиент подключается и записывает в канал. WriteFile (на клиенте) возвращает истину.

1 Ответ

1 голос
/ 29 мая 2020

ConnectNamedPipe возвращает ненулевое значение в случае успеха, поэтому это не сработало. Изменение if (!ConnectNamedPipe(pipe, NULL)) на if (ConnectNamedPipe(pipe, NULL)), похоже, работает нормально.

...