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

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

25.12.2016, 13:22. Показов 2930. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru