Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49

Двунаправленный PIPE: как реализовать двунаправленную связь?

25.12.2016, 13:22. Показов 2913. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
два приложения
один на С# (PIPE-server)
C#
1
2
handle = new NamedPipeServerStream( NAME, PipeDirection.InOut,
                  1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
второй на С++ (PIPE-client)
C++ (Qt)
1
2
3
4
5
6
7
hPipe = CreateFile( 
         NAME,       GENERIC_READ |     GENERIC_WRITE, 
         0,              // no sharing 
         NULL,           // default security attributes
         OPEN_EXISTING,  // opens existing pipe 
         0,              // default attributes 
         NULL);          // no template file
передают строки
работают только в одном направлении один передает другой принимает или наоборот.

Как сделать чтобы была двунаправленная связь? Чтобы по очереди работали функции Read и Write
Можно сделать два канала в одном приложении, один на чтение другой на запись? (пробовал, второй канал не создается)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.12.2016, 13:22
Ответы с готовыми решениями:

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

Двунаправленная связь через pipe
Нужна помощь в этом задании: Составить текст программы для связи между собой двух родственных процессов, исполняющих разные программы. ...

Реализовать пользовательский класс "Двунаправленный список"; реализовать добавление и удаление элементов
Записи в линейном списке содержат ключевое поле типа *char(строка символов). Сформировать двунаправленный список. Удалить К элементов с...

8
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
26.12.2016, 10:32
Пайпы это не совсем для новичков. Попробуй спросить в другом разделе.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.12.2016, 11:31
Цитата Сообщение от dav1977 Посмотреть сообщение
Как сделать чтобы была двунаправленная связь?
сделать два пайпа и на сервере и на клиенте?
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
26.12.2016, 12:28  [ТС]
Можно и по два pipe
Но лучше в одном обмениваться сообщениями
Теоретически все просто как в файловом потоке,
но на практике методы записи "зависают", а методы
чтения не видят сообщения.

Добавлено через 6 минут
Все работает только в однонаправленном режиме
т.е. Server только читает, а клиент только передает.
А необходимо двунаправленную связь.
0
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
26.12.2016, 12:40
Вы не привели пример того, как вы пытаетесь выполнить запись в pipe.
Также попробуйте функцию CallNamedPipe.
Вот пример на msdn:
https://msdn.microsoft.com/en-... 85%29.aspx
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
26.12.2016, 17:28  [ТС]
СЕРВЕР
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
                 pipeSERVER = new NamedPipeServerStream("tst",
                  PipeDirection.InOut, 1, PipeTransmissionMode.Message);
               pipeSERVER.WaitForConnection();
                byte[] request = Encoding.ASCII.GetBytes("test1server");
                pipeSERVER.Write(request, 0, request.Length);
                List<byte> response = new List<byte>();
                do
                {
                    response.Add((byte)pipeSERVER.ReadByte());
                }
                while (!pipeSERVER.IsMessageComplete);
                Console.WriteLine("Response 1 from client: {0}", 
                Encoding.ASCII.GetString(response.ToArray()));
КЛИЕНТ
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
HANDLE hPipe;
   LPTSTR lpszWrite = TEXT("Default message from client");
   TCHAR chReadBuf[BUFSIZE];
   BOOL fSuccess;
   DWORD cbRead, dwMode;
   LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\tst");
 
   // Try to open a named pipe; wait for it, if necessary. 
   while (1)
   {
       hPipe = CreateFile(
           lpszPipename,   // pipe name 
           GENERIC_READ |  // read and write access 
           GENERIC_WRITE,
           0,              // no sharing 
           NULL,           // default security attributes
           OPEN_EXISTING,  // opens existing pipe 
           0,              // default attributes 
           NULL);          // no template file 
 
                           // Break if the pipe handle is valid. 
       if (hPipe != INVALID_HANDLE_VALUE)
           break;
 
       // Exit if an error other than ERROR_PIPE_BUSY occurs. 
       if (GetLastError() != ERROR_PIPE_BUSY)
       {
           printf("Could not open pipe\n");
           return 0;
       }
 
       // All pipe instances are busy, so wait for 20 seconds. 
       if (!WaitNamedPipe(lpszPipename, 20000))
       {
           printf("Could not open pipe\n");
           return 0;
       }
   }
 
   // The pipe connected; change to message-read mode. 
   dwMode = PIPE_READMODE_MESSAGE;
   fSuccess = SetNamedPipeHandleState(
       hPipe,    // pipe handle 
       &dwMode,  // new pipe mode 
       NULL,     // don't set maximum bytes 
       NULL);    // don't set maximum time 
   if (!fSuccess)
   {
       printf("SetNamedPipeHandleState failed.\n");
       return 0;
   }
 
   // Read from the pipe if there is more data in the message.
   fSuccess = ReadFile(
       hPipe,      // pipe handle 
       chReadBuf,  // buffer to receive reply 
       BUFSIZE*sizeof(TCHAR),  // size of buffer 
       &cbRead,  // number of bytes read 
       NULL);    // not overlapped 
 
                 // Exit if an error other than ERROR_MORE_DATA occurs.
   if (!fSuccess && (GetLastError() != ERROR_MORE_DATA))
       printf("====== read bad ==========\n");
   else {
       printf("====== read ok ==========\n");
       _tprintf(TEXT("%s\n"), chReadBuf);
   }
 
 
 
   // Send a message to the pipe server and read the response. 
   printf("====== sending... ==========\n");
   fSuccess = TransactNamedPipe(//---------------------- функция "зависает"
       hPipe,                  // pipe handle 
       lpszWrite,              // message to server
       (lstrlen(lpszWrite) + 1)*sizeof(TCHAR), // message length 
       chReadBuf,              // buffer to receive reply
       BUFSIZE*sizeof(TCHAR),  // size of read buffer
       &cbRead,                // bytes read
       NULL);                  // not overlapped 
 
   printf("\n===== send ok ============\n")//--------------- сюда не попадаем
 
   if (!fSuccess && (GetLastError() != ERROR_MORE_DATA))
   {
       printf("====== error send ==========...\n");
       return 0;
   }
 
   printf("====== END ==========...\n");
printf("====== read ok ==========\n"); --- отрабатывает
не попадаем в строку
printf("\n===== send ok ============\n");
0
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
26.12.2016, 18:30
Мне кажется, проблема в вызове функции pipeSERVER.ReadByte(). Насколько я понимаю, она читает байты, а pipe находится в режиме обмена сообщениями (message). При чтении байт, предположительно, IsMessageComplete никогда не сработает. Попробуйте использовать функцию pipeSERVER.Read вместо этого.
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
26.12.2016, 18:56  [ТС]
что интересно, IsMessageComplete срабатывает и сервер получает строку
D e f a u l t m e s s a g e f r o m c l i e n t( ПРАВДА С ПРОБЕЛАМИ!!!)
а вот клиент на С++ зависает

Делал клиента на С# все работает.
А вот вместе С# и С++ не работают. (также наоборот Сервер на С++, клиент С# - тогда висит write в С#)
0
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
27.12.2016, 20:08
Возможно, TCHAR у вас - это юникодный двубайтовый wchar_t. А на другом конце вы читаете строку побайтово, и это не пробелы, а нулевые символы?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.12.2016, 20:08
Помогаю со студенческими работами здесь

1C + PHP: Как реализовать связь?
Привет всем. Нуждаюсь в вашей помощи. Есть такая задача, нужно чтоб на сайт написанный на php можно было загружать информацию с 1C. Как...

Двунаправленная связь через pipe между процессом-родителем и процессом-ребенком
Зачем мы используем в этой программе 2 пайпа? #include &lt;sys/types.h&gt; #include &lt;unistd.h&gt; #include &lt;stdio.h&gt; #include...

Как проще реализовать связь DB с JTable?
Господа! Подскажите, как путем наименьшего сопротивления реализовать на базе JTable аналог делфийского DBGrid? С отображением данных...

Как реализовать связь между ячейкой и GroupBox1
Добрый день. Прошу у вас помощи! Можно ли реализовать связь между DBGrit и GroupBox`ми. На рисунке все понятно) Мне нужно, что бы...

Связь в БД, не могу понять как ее реализовать в sql
Здравствуйте, подскажите пожалуйста как реализовать эту связь которая обведена красным.


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru