Подключение к именованной трубе - PullRequest
0 голосов
/ 30 апреля 2020

Я пытался использовать именованные каналы в C ++ для передачи сообщения с одного компьютера на другой. Но клиент не смог подключиться к серверу, он вернул ошибку 1326 (неверное имя или пароль), хотя имя сервера было указано правильно.

Какое отношение имеет пароль к каналу? И если в коде нет ошибок, то что еще может быть причиной ошибки подключения к каналу?

Также на Inte rnet я видел такую ​​форму, записывающую название канала \\servername\pipe\[path] pipename , servername - это имя сервера, pipe определяет, что это канал, а pipename - это имя канала, но что такое [path]?

Сервер

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

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

1 Ответ

0 голосов
/ 04 мая 2020

После моего тестирования в вашем коде есть два места, которые необходимо исправить.

Функция NetUseAdd устанавливает соединение между локальным компьютером и удаленным сервером. Вы можете указать букву локального диска или устройства принтера для подключения. Если вы не укажете букву локального диска или устройства принтера, функция аутентифицирует клиента на сервере для будущих подключений.

Кроме того, необходимо включить file and print sharing.

См .: именованный канал SMB без ограничений на подключение

После того, как все настроено, код может работать нормально.

...