NamedPipe. "ERROR_ACCESS_DENIED: Отказано в доступе". Ошибка при установке соединения в локальной сети между клиентом и сервером на разных компьютерах

Рейтинг: 1Ответов: 0Опубликовано: 09.03.2023

На одном компьютере все работает прекрасно. Код сервера:

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

#define PIPE TEXT("\\\\.\\pipe\\Tube")
#define MAX_SIZE_OF_BUFFER 64

string GetErrorMsgText(int code);
string SetPipeError(string msgText, int code);

int main()
{
    try {
        setlocale(LC_ALL, "rus");
        HANDLE sH;


        if ((sH = CreateNamedPipe(
            PIPE, // Имя канала
            PIPE_ACCESS_DUPLEX, // флаги направления канала (PIPE_ACCESS_DUPLEX - разрешает чтение и запись в канал)
            PIPE_TYPE_MESSAGE | PIPE_WAIT, // разрешает запись данных сообщениями\потоком байт в синхронном режиме
            1, // Максимальное кол-во экземпляров канала
            NULL, // размер выходного буфера
            NULL, // размер входного буфера
            INFINITE, // время ожидания связи с клиентом
            NULL)) == INVALID_HANDLE_VALUE) // аттрибуты безопасности 
        {
            throw SetPipeError("CreateNamedPipe:", GetLastError());

        }

        if (!ConnectNamedPipe(sH, NULL)) {
            throw SetPipeError("ConnectNamedPipe:", GetLastError());
        }
        
        cout << "Начинаем прослушку" << endl;

        DWORD dwRead;
        char buffer[50];

        while (ReadFile(sH, buffer, strlen(buffer-1), &dwRead, NULL) != FALSE)
        {
            cout << "Клиент прислал СМС: " << buffer << endl;
            WriteFile(sH, &buffer, strlen(buffer), &dwRead, NULL);
        }
        

        if (!DisconnectNamedPipe(sH)) {
            throw SetPipeError("DisconnectNamedPipe:", GetLastError());
        }
        if (!CloseHandle(sH)) {
            throw SetPipeError("CloseHandle:", GetLastError());
        }
    }
    catch (string ErrorPipeText) {
        cout << endl << ErrorPipeText;
    }
    
}

string GetErrorMsgText(int code) // Функция позволяет получить сообщение ошибки
{
    switch (code)                      // check return code   
    {
    case WSAEINTR: return "WSAEINTR: Работа функции прервана ";
    case WSAEACCES: return "WSAEACCES: Разрешение отвергнуто";
    case WSAEFAULT: return "WSAEFAULT: Ошибочный адрес";
    case WSAEINVAL: return "WSAEINVAL: Ошибка в аргументе";
    case WSAEMFILE: return "WSAEMFILE: Слишком много файлов открыто";
    case WSAEWOULDBLOCK: return "WSAEWOULDBLOCK: Ресурс временно недоступен";
    case WSAEINPROGRESS: return "WSAEINPROGRESS: Операция в процессе развития";
    case WSAEALREADY: return "WSAEALREADY: Операция уже выполняется";
    case WSAENOTSOCK: return "WSAENOTSOCK: Сокет задан неправильно";
    case WSAEDESTADDRREQ: return "WSAEDESTADDRREQ: Требуется адрес расположения";
    case WSAEMSGSIZE: return "WSAEMSGSIZE: Сообщение слишком длинное";
    case WSAEPROTOTYPE: return "WSAEPROTOTYPE: Неправильный тип протокола для сокета";
    case WSAENOPROTOOPT: return "WSAENOPROTOOPT: Ошибка в опции протокола";
    case WSAEPROTONOSUPPORT: return "WSAEPROTONOSUPPORT: Протокол не поддерживается";
    case WSAESOCKTNOSUPPORT: return "WSAESOCKTNOSUPPORT: Тип сокета не поддерживается";
    case WSAEOPNOTSUPP: return "WSAEOPNOTSUPP: Операция не поддерживается";
    case WSAEPFNOSUPPORT: return "WSAEPFNOSUPPORT: Тип протоколов не поддерживается";
    case WSAEAFNOSUPPORT: return "WSAEAFNOSUPPORT: Тип адресов не поддерживается протоколом";
    case WSAEADDRINUSE: return "WSAEADDRINUSE: Адрес уже используется";
    case WSAEADDRNOTAVAIL: return "WSAEADDRNOTAVAIL: Запрошенный адрес не может быть использован";
    case WSAENETDOWN: return "WSAENETDOWN: Сеть отключена";
    case WSAENETUNREACH: return "WSAENETUNREACH: Сеть не достижима";
    case WSAENETRESET: return "WSAENETRESET: Сеть разорвала соединение";
    case WSAECONNABORTED: return "WSAECONNABORTED: Программный отказ связи";
    case WSAECONNRESET: return "WSAECONNRESET: Связь восстановлена";
    case WSAENOBUFS: return "WSAENOBUFS: Не хватает памяти для буферов";
    case WSAEISCONN: return "WSAEISCONN: Сокет уже подключен";
    case WSAENOTCONN: return "WSAENOTCONN: Сокет не подключен";
    case WSAESHUTDOWN: return "WSAESHUTDOWN: Нельзя выполнить send : сокет завершил работу";
    case WSAETIMEDOUT: return "WSAETIMEDOUT: Закончился отведенный интервал  времени";
    case WSAECONNREFUSED: return "WSAECONNREFUSED: Соединение отклонено";
    case WSAEHOSTDOWN: return "WSAEHOSTDOWN: Хост в неработоспособном состоянии";
    case WSAEHOSTUNREACH: return "WSAEHOSTUNREACH: Нет маршрута для хоста";
    case WSAEPROCLIM: return "WSAEPROCLIM: Слишком много процессов";
    case WSASYSNOTREADY: return "WSASYSNOTREADY: Сеть не доступна";
    case WSAVERNOTSUPPORTED: return "WSAVERNOTSUPPORTED: Данная версия недоступна";
    case WSANOTINITIALISED: return "WSANOTINITIALISED: Не выполнена инициализация WS2_32.DLL";
    case WSAEDISCON: return "WSAEDISCON: Выполняется отключение";
    case WSATYPE_NOT_FOUND: return "WSATYPE_NOT_FOUND: Класс не найден";
    case WSAHOST_NOT_FOUND: return "WSAHOST_NOT_FOUND: Хост не найден";
    case WSATRY_AGAIN: return "WSATRY_AGAIN: Неавторизированный хост не найден";
    case WSANO_RECOVERY: return "WSANO_RECOVERY: Неопределенная ошибка";
    case WSANO_DATA: return "WSANO_DATA: Нет записи запрошенного типа";
    case WSA_INVALID_HANDLE: return "WSA_INVALID_HANDLE: Указанный дескриптор события с ошибкой";
    case WSA_INVALID_PARAMETER: return "WSA_INVALID_PARAMETER: Один или более параметров с ошибкой";
    case WSA_IO_INCOMPLETE: return "WSA_IO_INCOMPLETE: Объект ввода - вывода не в сигнальном состоянии";
    case WSA_IO_PENDING: return "WSA_IO_PENDING: Операция завершится позже";
    case WSA_NOT_ENOUGH_MEMORY: return "WSA_NOT_ENOUGH_MEMORY: Не достаточно памяти";
    case WSA_OPERATION_ABORTED: return "WSA_OPERATION_ABORTED: Операция отвергнута";
    case WSASYSCALLFAILURE: return "WSASYSCALLFAILURE: Аварийное завершение системного вызова";
    default: return "**ERROR**";
    };
}

string SetPipeError(string msgText, int code) // Функция возвращает сообщение ошибки
{
    return msgText + GetErrorMsgText(code);
}

Код клиента:

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


#define PIPEG TEXT("\\\\servname\\pipe\\Tube")
#define PIPEL TEXT("\\\\.\\pipe\\Tube")
#define MAX_SIZE_OF_BUFFER 64

string GetErrorMsgText(int code);
string SetPipeError(string msgText, int code);
 
int main()
{
    try {
        setlocale(LC_ALL, "rus");
        HANDLE cH;
        if ((cH = CreateFile(PIPEG, // Имя канала
            GENERIC_READ | GENERIC_WRITE, // Чтение и запись
            0, // Совместное чтение и запись
            NULL, // атрибуты безопасности
            OPEN_EXISTING, //  открытие существующего канала
            NULL, // флаги и атрибуты
            NULL)) == INVALID_HANDLE_VALUE) // доп флаги
        {
            throw SetPipeError("CreateFile:", GetLastError());
        }
        
        DWORD dwWrite;
        char buffer[50] = {"Hello Server"};

        int count;
        cout << "Введите кол-во сообщений: ";
        cin >> count;

        for (int i = 1; i <= count; i++) {
            if (!WriteFile(cH, &buffer, strlen(buffer - 1), &dwWrite, NULL)) {
                throw SetPipeError("WriteFile:", GetLastError());
            }

            if (!ReadFile(cH, buffer, MAX_SIZE_OF_BUFFER, &dwWrite, NULL)) {
                throw SetPipeError("ReadFile:", GetLastError());
            }
            cout << "Сервер прислал СМС: " << buffer << endl;
        }
         

        if (!CloseHandle(cH)) {
            throw SetPipeError("CloseHandle:", GetLastError());
        }
    }
    catch (string ErrorPipeText) {
        cout << endl << ErrorPipeText;
    }
    
}

string GetErrorMsgText(int code) // Функция позволяет получить сообщение ошибки
{
    switch (code)                      // check return code   
    {
    case WSAEINTR: return "WSAEINTR: Работа функции прервана ";
    case WSAEACCES: return "WSAEACCES: Разрешение отвергнуто";
    case WSAEFAULT: return "WSAEFAULT: Ошибочный адрес";
    case WSAEINVAL: return "WSAEINVAL: Ошибка в аргументе";
    case WSAEMFILE: return "WSAEMFILE: Слишком много файлов открыто";
    case WSAEWOULDBLOCK: return "WSAEWOULDBLOCK: Ресурс временно недоступен";
    case WSAEINPROGRESS: return "WSAEINPROGRESS: Операция в процессе развития";
    case WSAEALREADY: return "WSAEALREADY: Операция уже выполняется";
    case WSAENOTSOCK: return "WSAENOTSOCK: Сокет задан неправильно";
    case WSAEDESTADDRREQ: return "WSAEDESTADDRREQ: Требуется адрес расположения";
    case WSAEMSGSIZE: return "WSAEMSGSIZE: Сообщение слишком длинное";
    case WSAEPROTOTYPE: return "WSAEPROTOTYPE: Неправильный тип протокола для сокета";
    case WSAENOPROTOOPT: return "WSAENOPROTOOPT: Ошибка в опции протокола";
    case WSAEPROTONOSUPPORT: return "WSAEPROTONOSUPPORT: Протокол не поддерживается";
    case WSAESOCKTNOSUPPORT: return "WSAESOCKTNOSUPPORT: Тип сокета не поддерживается";
    case WSAEOPNOTSUPP: return "WSAEOPNOTSUPP: Операция не поддерживается";
    case WSAEPFNOSUPPORT: return "WSAEPFNOSUPPORT: Тип протоколов не поддерживается";
    case WSAEAFNOSUPPORT: return "WSAEAFNOSUPPORT: Тип адресов не поддерживается протоколом";
    case WSAEADDRINUSE: return "WSAEADDRINUSE: Адрес уже используется";
    case WSAEADDRNOTAVAIL: return "WSAEADDRNOTAVAIL: Запрошенный адрес не может быть использован";
    case WSAENETDOWN: return "WSAENETDOWN: Сеть отключена";
    case WSAENETUNREACH: return "WSAENETUNREACH: Сеть не достижима";
    case WSAENETRESET: return "WSAENETRESET: Сеть разорвала соединение";
    case WSAECONNABORTED: return "WSAECONNABORTED: Программный отказ связи";
    case WSAECONNRESET: return "WSAECONNRESET: Связь восстановлена";
    case WSAENOBUFS: return "WSAENOBUFS: Не хватает памяти для буферов";
    case WSAEISCONN: return "WSAEISCONN: Сокет уже подключен";
    case WSAENOTCONN: return "WSAENOTCONN: Сокет не подключен";
    case WSAESHUTDOWN: return "WSAESHUTDOWN: Нельзя выполнить send : сокет завершил работу";
    case WSAETIMEDOUT: return "WSAETIMEDOUT: Закончился отведенный интервал  времени";
    case WSAECONNREFUSED: return "WSAECONNREFUSED: Соединение отклонено";
    case WSAEHOSTDOWN: return "WSAEHOSTDOWN: Хост в неработоспособном состоянии";
    case WSAEHOSTUNREACH: return "WSAEHOSTUNREACH: Нет маршрута для хоста";
    case WSAEPROCLIM: return "WSAEPROCLIM: Слишком много процессов";
    case WSASYSNOTREADY: return "WSASYSNOTREADY: Сеть не доступна";
    case WSAVERNOTSUPPORTED: return "WSAVERNOTSUPPORTED: Данная версия недоступна";
    case WSANOTINITIALISED: return "WSANOTINITIALISED: Не выполнена инициализация WS2_32.DLL";
    case WSAEDISCON: return "WSAEDISCON: Выполняется отключение";
    case WSATYPE_NOT_FOUND: return "WSATYPE_NOT_FOUND: Класс не найден";
    case WSAHOST_NOT_FOUND: return "WSAHOST_NOT_FOUND: Хост не найден";
    case WSATRY_AGAIN: return "WSATRY_AGAIN: Неавторизированный хост не найден";
    case WSANO_RECOVERY: return "WSANO_RECOVERY: Неопределенная ошибка";
    case WSANO_DATA: return "WSANO_DATA: Нет записи запрошенного типа";
    case WSA_INVALID_HANDLE: return "WSA_INVALID_HANDLE: Указанный дескриптор события с ошибкой";
    case WSA_INVALID_PARAMETER: return "WSA_INVALID_PARAMETER: Один или более параметров с ошибкой";
    case WSA_IO_INCOMPLETE: return "WSA_IO_INCOMPLETE: Объект ввода - вывода не в сигнальном состоянии";
    case WSA_IO_PENDING: return "WSA_IO_PENDING: Операция завершится позже";
    case WSA_NOT_ENOUGH_MEMORY: return "WSA_NOT_ENOUGH_MEMORY: Не достаточно памяти";
    case WSA_OPERATION_ABORTED: return "WSA_OPERATION_ABORTED: Операция отвергнута";
    case WSASYSCALLFAILURE: return "WSASYSCALLFAILURE: Аварийное завершение системного вызова";
    case ERROR_LOGON_FAILURE: return "ERROR_LOGON_FAILURE: 1326: Вход в систему не произведен: имя пользователя или пароль не опознаны.";
    case ERROR_FILE_NOT_FOUND: return "ERROR_FILE_NOT_FOUND: Не удалось найти файл(канал)";
    case ERROR_ACCESS_DENIED: return "ERROR_ACCESS_DENIED: Отказано в доступе";
    default: return "**ERROR**";
    };
}

string SetPipeError(string msgText, int code) // Функция возвращает сообщение ошибки
{
    return msgText + GetErrorMsgText(code);
}

Естественно, при попытке установки соединения на разных компьютерах в локальной сети, в приложении-клиенте я менял "servname" в #define PIPEG TEXT("\\servname\pipe\Tube") на hostname компьютера-сервера. И всегда возникает ошибка "ERROR_ACCESS_DENIED: Отказано в доступе".

Ответы

Ответов пока нет.