Подключение к именованному каналу

Пробовал с помощью именованных каналов на c++ передать сообщение с одного компьютера на другой. Но клиент не мог подключиться к серверу, выдавал ошибку 1326(неверное имя или пароль), хотя имя сервера указано правильно. Вопрос: какое отношение к каналу имеет пароль? И если в коде нет ошибок, то что ещё может быть причиной ошибки подключения к каналу? И ещё в интернете видел такую форму запись имени канала \servername\pipe[path]pipename. servname-имя сервера, pipe-определяет что это канал, а pipename-имя канала, но что такое [path]?

Код сервера

#include <windows.h>
#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    HANDLE hNamedPipe;
    DWORD dwBytesRead; // для количества прочитанных байтов
    DWORD dwBytesWrite; // для количества записанных байтов
    char pchMessage[80]; // для сообщения
    int nMessageLength; // длина сообщения

                        // инициализация атрибутов безопасности
    PSECURITY_DESCRIPTOR psd;
    SECURITY_ATTRIBUTES sa;
    psd = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
    InitializeSecurityDescriptor(psd, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(psd, true, NULL, false);
    sa.nLength = sizeof(sa);
    sa.bInheritHandle = true;
    sa.lpSecurityDescriptor = psd;

    hNamedPipe= CreateNamedPipe("\\\\.\\pipe\\pipe", PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | WRITE_OWNER, PIPE_READMODE_MESSAGE | PIPE_TYPE_MESSAGE| PIPE_ACCEPT_REMOTE_CLIENTS, PIPE_UNLIMITED_INSTANCES, 2048, 2048, INFINITE, &sa);
    // проверяем на успешное создание
    if (hNamedPipe == INVALID_HANDLE_VALUE)
    {
            cerr << "Create named pipe failed." << endl
            << "The last error code: " << GetLastError() << endl;
        cout << "Press any key to exit.";
        cin.get();

        return 0;
    }
    // ждем, пока клиент свяжется с каналом
    cout << "The server is waiting for connection with a client." << endl;
    if (!ConnectNamedPipe(
        hNamedPipe, // дескриптор канала
        NULL // связь синхронная
    ))
    {
        cerr << "Connect named pipe failed." << endl
            << "The last error code: " << GetLastError() << endl;
        CloseHandle(hNamedPipe);
        cout << "Press any key to exit.";
        cin.get();

        return 0;
    }
    // читаем сообщение от клиента
    if (!ReadFile(
        hNamedPipe, // дескриптор канала
        pchMessage, // адрес буфера для ввода данных
        sizeof(pchMessage), // количество читаемых байтов
        &dwBytesRead, // количество прочитанных байтов
        NULL)) // передача данных синхронная
    {
        cerr << "Data reading from the named pipe failed." << endl
            << "The last error code: " << GetLastError() << endl;
        CloseHandle(hNamedPipe);
        cout << "Press any key to exit.";
        cin.get();

        return 0;
    }

    // выводим полученное от клиента сообщение на консоль
    cout << "The server received the message from a client: "
        << endl << '\t' << pchMessage << endl;

    // вводим строку
    cout << "Input a string: ";
    cin.getline(pchMessage, 80);
    // определяем длину строки
    nMessageLength = strlen(pchMessage) + 1;

    // отвечаем клиент
        if (!WriteFile(
            hNamedPipe, // дескриптор канала
            pchMessage, // адрес буфера для вывода данных
            nMessageLength, // количество записываемых байтов
            &dwBytesWrite, // количество записанных байтов
            NULL // передача данных синхронная
        ))
        {
            cerr << "Write file failed." << endl
                << "The last error code: " << GetLastError() << endl;
            CloseHandle(hNamedPipe);
            cout << "Press any key to exit.";
            cin.get();

            return 0;
        }

    // выводим посланное клиенту сообщение на консоль
    cout << "The server sent the message to a client: "
        << endl << '\t' << pchMessage << endl;

    // закрываем дескриптор канала
    CloseHandle(hNamedPipe);
    // завершаем процесс
    cout << "Press any key to exit.";
    cin.get();

    return 0;
}

Код клиента

#include <windows.h>
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string machineName;
    getline(cin, machineName, '\n');
    machineName= "\\\\"+machineName+"\\pipe\\pipe";
    cout << machineName << endl;
    char pipeName[80];
    strcpy_s(pipeName, machineName.c_str());
    HANDLE hNamedPipe;
    DWORD dwBytesWritten; // для количества записанных байтов
    DWORD dwBytesRead; // для количества прочитанных байтов
    char pchMessage[80]; // для сообщения
    int nMessageLength; // длина сообщения

                        // вводим имя машины в сети, на которой работает сервер
    // подставляем имя машины в имя канала

    // связываемся с именованным каналом
    hNamedPipe = CreateFile(
        pipeName, // имя канала
        GENERIC_READ | GENERIC_WRITE, // читаем и записываем в канал
        FILE_SHARE_READ | FILE_SHARE_WRITE, // разрешаем чтение и запись
        NULL, // безопасность по умолчанию
        OPEN_EXISTING, // открываем существующий канал
        FILE_ATTRIBUTE_NORMAL, // атрибуты по умолчанию
        NULL); // дополнительных атрибутов нет

               // проверяем связь с каналом
    if (hNamedPipe == INVALID_HANDLE_VALUE)
    {
        cerr << "Connection with the named pipe failed." << endl
            << "The last error code: " << GetLastError() << endl;
        cout << "Press any key to exit.";
        cin.get();
        return 0;
    }
    // вводим строку
    cin.get();
    cout << "Input a string: ";
    cin.getline(pchMessage, 80);
    // определяем длину строки
    nMessageLength = strlen(pchMessage) + 1;
    // пишем в именованный канал
    if (!WriteFile(
        hNamedPipe, // дескриптор канала
        pchMessage, // данные
        nMessageLength, // размер данных
        &dwBytesWritten, // количество записанных байтов
        NULL)) // синхронная запись
    {
            // ошибка записи
            cerr << "Write file failed: " << endl
            << "The last error code: " << GetLastError() << endl;
        CloseHandle(hNamedPipe);
        cout << "Press any key to exit.";
        cin.get();
        return 0;
    }
    // выводим посланное сообщение на консоль
    cout << "The client sent the message to a server: "
        << endl << '\t' << pchMessage << endl;
    // читаем из именованного канала
    if (!ReadFile(
        hNamedPipe, // дескриптор канала
        pchMessage, // данные
        sizeof(pchMessage), // размер данных
        &dwBytesRead, // количество записанных байтов
        NULL)) // синхронное чтение
    {
        // ошибка чтения
        cerr << "Read file failed: " << endl
            << "The last error code: " << GetLastError() << endl;
        CloseHandle(hNamedPipe);
        cout << "Press any key to exit.";
        cin.get();
        return 0;
    }
    // выводим полученное сообщение на консоль
    cout << "The client received the message from a server: "
        << endl << '\t' << pchMessage << endl;
    // закрываем дескриптор канала
    CloseHandle(hNamedPipe);
    // завершаем процесс
    cout << "Press any key to exit.";
    cin.get();
    return 0;
}

Ответы (0 шт):