Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140

Pipe - работа в сети: клиент не может подключиться к созданному каналу из-за отсутствия доступа

23.10.2014, 12:39. Показов 2973. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Изучаю С++CLI. Создал консольные приложения Клиент - Сервер. В пределах одной рабочей станции все работает - сервер создает канал PIPE, подключается к нему, клиент подключается к созданному каналу и начинается обмен данными.
Вот собственно код метода создания канала PIPE:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
      static void ServerThread() {
         NamedPipeServerStream^ pipeServer = gcnew NamedPipeServerStream("$MyPipe$",
                              PipeDirection::InOut, numThreads);  // инициализация нового экземпляра класса каналов
 
         int threadId = Thread::CurrentThread->ManagedThreadId;   // получили ID канала (потока)
         pipeServer->WaitForConnection();                         // ожидает подключения клиента к данному объекту
         //throw 3;
         Console::WriteLine("Клиент подключен, ID потока [{0}].", threadId);
         try {
            // Читайте запрос от клиента. После того, как клиент имеет Написано к трубе его маркер безопасности будут доступны.
            StreamString^ ss = gcnew StreamString(pipeServer);
            ss->WriteString("passwords");                         // отправляет клиенту идентификатор (пароль)
            String^ filename = ss->ReadString();                  // читает по байтам в потоке
            // Читайте в содержимом файла, а выдает себя за клиента.
            ReadFileToStream^ fileReader = gcnew ReadFileToStream(ss, filename);
            // Информация для вывода на консоль - имя_файла, ID канала, имя пользователя на другом конце канала
            Console::WriteLine("Reading file: {0} on thread[{1}] as user: {2}.", filename, threadId, pipeServer->GetImpersonationUserName());
            pipeServer->RunAsClient(gcnew PipeStreamImpersonationWorker(fileReader, &ReadFileToStream::Start));   // вызывает делегата во время выполнения олицетворения клиента
         }
         // Поймать IOException, которое возникает, если труба разбивается Или отключен.
         catch (IOException^ e) {
            Console::WriteLine("ERROR: {0}", e->Message);
         }
         pipeServer->Close();       // закрывает текущий поток и отключает все ресурсы
      }
При попытке выноса любой части за пределы рабочей станции, но в пределах одной локальной сети, клиент не может подключиться к созданному каналу из-за отсутствия доступа к созданному каналу. В связи с этим решил при создании NamedPipeServerStream определить правила управления доступом и аудита безопасности для канала. Вот измененный код метода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
      static void ServerThread() {
         PipeSecurity^ pipeSa = gcnew PipeSecurity();
         PipeAccessRule^ pipeAR = gcnew PipeAccessRule("Everyone", PipeAccessRights::ReadWrite, System::Security::AccessControl::AccessControlType::Allow);
         pipeSa->AddAccessRule(pipeAR);
 
         NamedPipeServerStream^ pipeServer = gcnew NamedPipeServerStream("$MyPipe$",   // инициализация нового экземпляра класса каналов
              PipeDirection::InOut, numThreads, PipeTransmissionMode::Byte, PipeOptions::WriteThrough | PipeOptions::Asynchronous, 2048, 2048, pipeSa);
 
         int threadId = Thread::CurrentThread->ManagedThreadId;   // получили ID канала (потока)
         pipeServer->WaitForConnection();                         // ожидает подключения клиента к данному объекту
         //throw 3;
         Console::WriteLine("Клиент подключен, ID потока [{0}].", threadId);
         try {
            // Читайте запрос от клиента. После того, как клиент имеет Написано к трубе его маркер безопасности будут доступны.
            StreamString^ ss = gcnew StreamString(pipeServer);
            ss->WriteString("passwords");                         // отправляет клиенту идентификатор (пароль)
            String^ filename = ss->ReadString();                  // читает по байтам в потоке
            // Читайте в содержимом файла, а выдает себя за клиента.
            ReadFileToStream^ fileReader = gcnew ReadFileToStream(ss, filename);
            // Информация для вывода на консоль - имя_файла, ID канала, имя пользователя на другом конце канала
            Console::WriteLine("Reading file: {0} on thread[{1}] as user: {2}.", filename, threadId, pipeServer->GetImpersonationUserName());
            pipeServer->RunAsClient(gcnew PipeStreamImpersonationWorker(fileReader, &ReadFileToStream::Start));   // вызывает делегата во время выполнения олицетворения клиента
         }
         // Поймать IOException, которое возникает, если труба разбивается Или отключен.
         catch (IOException^ e) {
            Console::WriteLine("ERROR: {0}", e->Message);
         }
         pipeServer->Close();       // закрывает текущий поток и отключает все ресурсы
      }
И тут возникает ошибка исключения при создании канала. Понимаю, что что то напутал с DACL т.к. ранее не работал с ним. Подскажите куда копать дальше.

Добавлено через 3 часа 25 минут
Момент с созданием канала решен, но теперь возникает проблема при подключении сервером к созданному каналу, ошибка - отказано в доступе по данному пути.
Не могу понять, какое значение из перечисления WellKnownSidType нужно использовать, что бы созданный сервером канал, был бы ему же доступен для подключения. Подскажите гуру куда копать дальше.
Вот код метода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
static void ServerThread() {
         NamedPipeServerStream^ pipeServer;
         
         // создание правила управления доступом и аудита безопасности для канала 
         PipeSecurity^ pipeSa = gcnew PipeSecurity();
         SecurityIdentifier^ pipeSI = gcnew SecurityIdentifier(WellKnownSidType::AuthenticatedUserSid, nullptr);        // SID пользователя для PIPE
         PipeAccessRule^ pipeAR = gcnew PipeAccessRule(pipeSI, PipeAccessRights::ReadWrite, AccessControlType::Allow);  // правило доступа для PIPE
         pipeSa->AddAccessRule(pipeAR);                                                                                 // добавляет новое правило
 
         /*NamedPipeServerStream^*/ pipeServer = gcnew NamedPipeServerStream("$MyPipe$",   // инициализация нового экземпляра класса каналов
            PipeDirection::InOut, numThreads, PipeTransmissionMode::Byte, PipeOptions::WriteThrough | PipeOptions::Asynchronous, 2048, 2048, pipeSa);
 
         int threadId = Thread::CurrentThread->ManagedThreadId;   // получили ID канала (потока)
         pipeServer->WaitForConnection();                         // ожидает подключения клиента к данному объекту
         Console::WriteLine("Клиент подключен, ID потока [{0}].", threadId);
         try {
            // Читайте запрос от клиента. После того, как клиент имеет Написано к трубе его маркер безопасности будут доступны.
            StreamString^ ss = gcnew StreamString(pipeServer);
            ss->WriteString("passwords");                         // отправляет клиенту идентификатор (пароль)
            String^ filename = ss->ReadString();                  // читает по байтам в потоке
            // Читайте в содержимом файла, а выдает себя за клиента.
            ReadFileToStream^ fileReader = gcnew ReadFileToStream(ss, filename);
            // Информация для вывода на консоль - имя_файла, ID канала, имя пользователя на другом конце канала
            Console::WriteLine("Reading file: {0} on thread[{1}] as user: {2}.", filename, threadId, pipeServer->GetImpersonationUserName());
            pipeServer->RunAsClient(gcnew PipeStreamImpersonationWorker(fileReader, &ReadFileToStream::Start));   // вызывает делегата во время выполнения олицетворения клиента
         }
         // Поймать IOException, которое возникает, если труба разбивается Или отключен.
         catch (IOException^ e) {
            Console::WriteLine("ERROR: {0}", e->Message);
         }
         pipeServer->Close();       // закрывает текущий поток и отключает все ресурсы
      }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.10.2014, 12:39
Ответы с готовыми решениями:

Не могу подключиться к сети Wfi МГТС Gpon. Пишет что винда не может подключиться
Скрины

В каком элементе сети может быть причина отсутствия интернета?
Всем доброго времени суток! Я работаю системным администратором в не большом вузе, техно парк порядка 40 ЭВМ и с 10 МФУ и один сервак....

Клиент не может подключиться к серверу
Доброго времени суток! Делая задания по серверам, столкнулся с проблемой, что клиент не может подключиться к серверу. Несколько раз...

3
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140
23.10.2014, 18:33  [ТС]
В серверной части закомментировал оба варианта правил управления доступом и аудита безопасности для канала. Т.е. теперь на одной рабочей станции оба приложения работают:
- сервер создает канал
- сервер подключается к созданному каналу
- клиент подключается к каналу
- происходит обмен данными
В сети это не работает, клиент не может подключиться к каналу из-за отсутствия доступа, хотя видит его. Если включить первый вариант правил, то ситуация не изменится. Если включить второй вариант правил, то:
- сервер создаст канал
- подключится к созданному каналу не может из-за отсутствия прав !!!
Как это все победить. Ведь под WinApi создал подобный проект, все работает и в сети и на одной рабочей станции. Но нужен именно C++CLI либо C#.
На всякий случай выкладываю проект клиент-серверного приложения PIPE_CLR_Server.zip
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
24.10.2014, 09:57
Подключение к серверу может блокироваться фаерволом, так что
для начала нужно разобраться с ним, а не воевать с DACL.
То есть, добавить разрешающее правило (для теста можно
попробовать просто отключить фаервол).
0
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140
24.10.2014, 12:43  [ТС]
Файервол в данном случае не при чем. На тех же ПК, созданные под WinApi приложения соединяются и обмениваются информацией.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.10.2014, 12:43
Помогаю со студенческими работами здесь

WinSock клиент не может подключиться к серверу
Есть Сервер: //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop ...

TcpChannel клиент не может подключиться к серверу
у меня проблема есть клиент: namespace Client { public partial class Form1 : Form { string s; ...

Почему WriteFile не отправляет сообщение по каналу Pipe
Почему WriteFile не отправляет сообщение по каналу Pipe ситуация следующая , есть два приложения на с++ я написал сервер который...

Wi-fi адаптер не может подключиться, но сети видит
Интернет был, все было настроено, ничего не меняла в настройках..интернет пропал. Такое ощущение что адаптер накрылся. Хотя индикатор...

Не получается подключиться к сети интернет (роутер МГТС+точка доступа)
Соединил свою точку доступа с роутером МГТС, через ефернет порты. Такой изврат нужен так как коридор длинный и сигнал глохнет. Комп...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru