Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140

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

23.10.2014, 12:39. Показов 2955. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru