Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/75: Рейтинг темы: голосов - 75, средняя оценка - 4.93
2 / 2 / 1
Регистрация: 18.11.2015
Сообщений: 104

Передача сообщений через pipe

09.11.2018, 17:24. Показов 15307. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помочь с реализацией курсового проекта. Я очень плохо шарю в c++, поэтому ничего не могу понять( Нужно через pipe реализовать следующие задачи:
В одномерном массиве, состоящем из η вещественных элементов, вычислить:
1) максимальный элемент массива;
2) сумму элементов массива, расположенных до последнего положительного эле¬мента.
Сжать массив, удалив из него все элементы, модуль которых находится в интервале [а,b]. Освободившиеся в конце массива элементы заполнить нулями.
Сложность в том, что нужно создать два консольных приложения client и server.
Client отправляет массив, server получает его, обрабатывает и отправляет клиенту ответ.
Заранее спасибо всем, кто поможет или хотя бы попытается)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.11.2018, 17:24
Ответы с готовыми решениями:

Передача больших сообщений
Проблема состоит в том что сервер принимает структуру в структуре есть поле char a; оно передается нормально некоторое время, а потом...

Передача сообщений между клиентами
Всем привет! Пытаюсь написать программу для передачи сообщений между клиентами (пример взят из статьи "Самоучитель игры на...

Передача координат транспорта в виде коротких сообщений
Разработать программу передачи координат транспорта г Москвы в виде коротких сообщений, обеспечивающих минимальный трафик. Для этого ввести...

8
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
11.11.2018, 19:50
vany200397, вы про собственно pipe читали? Мысли есть?
0
2 / 2 / 1
Регистрация: 18.11.2015
Сообщений: 104
11.11.2018, 19:51  [ТС]
Я уже решил задачу. Можно закрывать, спасибо
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
12.11.2018, 06:26
vany200397, это оч хорошо, остальным покажете во имя добра)?
0
2 / 2 / 1
Регистрация: 18.11.2015
Сообщений: 104
12.11.2018, 07:22  [ТС]
Лучший ответ Сообщение было отмечено vxg как решение

Решение

Конечно)

Клиент:
C++ (Qt)
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
91
92
93
94
95
96
97
98
// gClient.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
  TCHAR   pipeName[80] = L"\\\\.\\pipe\\demo_pipe";
  HANDLE   hNamedPipe;
  DWORD   dwBytesWritten;    // для количества записанных байтов
  DWORD   dwBytesRead;       // для количества прочитанных байтов
  double     pchMessage[5] = {};   // для сообщения
  int    nMessageLength;     // длина сообщения
  char  pchResponse[80];
  
  // связываемся с именованным каналом
  hNamedPipe = CreateFile(
    pipeName,          // имя канала
    GENERIC_READ | GENERIC_WRITE,       // читаем и записываем в канал
    FILE_SHARE_READ | FILE_SHARE_WRITE, // разрешаем чтение и запись 
    NULL,                  // безопасность по умолчанию
    OPEN_EXISTING,         // открываем существующий канал
    FILE_ATTRIBUTE_NORMAL, // атрибуты по умолчанию
    NULL);                 // дополнительных атрибутов нет
  
  // проверяем связь с каналом
  if (hNamedPipe==INVALID_HANDLE_VALUE)
  {
    cerr << "Connection with the named pipe failed." << endl
      << "The last error code: " << GetLastError() << endl;
    cout << "Press any key to exit.";
    cin.get();
 
    return 0;
  }
 
  // вводим строку
  cout << "Input an array: ";
  for (int i=0; i<5; i++)
  { 
    cin>>pchMessage[i];
  }
  nMessageLength=sizeof(pchMessage)+1;
  //cout << nMessageLength<< endl;
  // пишем в именованный канал
  if (!WriteFile(
    hNamedPipe,      // дескриптор канала
    pchMessage,      // данные
    nMessageLength,  // размер данных
    &dwBytesWritten, // количество записанных байтов
    NULL))           // синхронная запись
  {
    // ошибка записи
    cerr << "Write file failed: " << endl
      << "The last error code: " << GetLastError() << endl;
    CloseHandle(hNamedPipe);
    cout << "Press any key to exit.";
    cin.get();
 
    return 0;
  }
  // выводим посланное сообщение на консоль
  cout << "The client sent the message to a server: "<< endl;
     for (int i=0; i<5; i++)
  { 
    cout<<pchMessage[i]<< endl;
  }
  // читаем из именованного канала
  if (!ReadFile(
    hNamedPipe,      // дескриптор канала
    pchResponse,      // данные
    sizeof(pchResponse),  // размер данных
    &dwBytesRead,    // количество записанных байтов
    NULL))           // синхронное чтение
  {
    // ошибка чтения
    cerr << "Read file failed: " << endl
      << "The last error code: " << GetLastError() << endl;
    CloseHandle(hNamedPipe);
    cout << "Press any key to exit.";
    cin.get();
 
    return 0;
  }
  // выводим полученное сообщение на консоль
  cout << "The client received the message from a server: "
    << endl << '\t' << pchResponse << endl;
  // закрываем дескриптор канала
  CloseHandle(hNamedPipe);
  // завершаем процесс
  cout << "Press any key to exit.";
  cin.get();
 
  return 0;
}
Сервер:

C++ (Qt)
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// gServer.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
bool wayToSort(double i, double j) { return i > j; }
int main()
{
  HANDLE   hNamedPipe;
  DWORD   dwBytesRead;     // для количества прочитанных байтов
  DWORD   dwBytesWrite;    // для количества записанных байтов
  double     pchMessage[5] = {};   // для сообщения
  int    nMessageLength;   // длина сообщения
  char  pchResponse[80];
  double arrsum = 0;
  double arrmult = 1;
  double arrminabs = DBL_MAX;
  double arrmaxabs = DBL_MIN;
  int iminabs;
  int imaxabs;
 
  // создаем именованный канал для чтения и записи
  hNamedPipe = CreateNamedPipe(
    L"\\\\.\\pipe\\demo_pipe",  // имя канала
    PIPE_ACCESS_DUPLEX,        // читаем из канала и пишем в канал
    PIPE_TYPE_MESSAGE | PIPE_WAIT,   // синхронная передача сообщений
    1,         // максимальное количество экземпляров канала 
    0,         // размер выходного буфера по умолчанию
    0,         // размер входного буфера по умолчанию
    INFINITE,  // клиент ждет связь бесконечно долго
    NULL       // безопасность по умолчанию
    );
  // проверяем на успешное создание
  if (hNamedPipe == INVALID_HANDLE_VALUE)
  {
    cerr << "Create named pipe failed." << endl
      << "The last error code: " << GetLastError() << endl;
    cout << "Press any key to exit.";
    cin.get();
 
    return 0;
  }
  
  // ждем, пока клиент свяжется с каналом
  cout << "The server is waiting for connection with a client." << endl;
  if(!ConnectNamedPipe(
    hNamedPipe,    // дескриптор канала
    NULL      // связь синхронная
    ))
  {
    cerr << "Connect named pipe failed." << endl
      << "The last error code: "<<GetLastError() << endl;
    CloseHandle(hNamedPipe);
    cout << "Press any key to exit.";
    cin.get();
 
    return 0;
  }
  // читаем сообщение от клиента
  if (!ReadFile(
    hNamedPipe,      // дескриптор канала
    pchMessage,      // адрес буфера для ввода данных
    sizeof(pchMessage),  // количество читаемых байтов
    &dwBytesRead,    // количество прочитанных байтов
    NULL))           // передача данных синхронная
  {
    cerr << "Data reading from the named pipe failed." << endl
      << "The last error code: "<< GetLastError() << endl;
    CloseHandle(hNamedPipe);
    cout << "Press any key to exit.";
    cin.get();
 
    return 0;
  }
 
  // выводим полученное от клиента сообщение на консоль
  sort(pchMessage,pchMessage+5,wayToSort);
  cout << "The server received the message from a client: "<< endl;
    for (int i=0; i<5; i++)
  { 
    cout<<pchMessage[i]<< endl;
    if (pchMessage[i]<0)
    {
        arrsum+=pchMessage[i];
    }
    if (abs(pchMessage[i])<arrminabs)
    {
        arrminabs=abs(pchMessage[i]);
        iminabs = i;
    }
    if (abs(pchMessage[i])>arrmaxabs)
    {
        arrmaxabs=abs(pchMessage[i]);
        imaxabs = i;
    }
  }
  if (imaxabs>iminabs)
    {
        swap(imaxabs,iminabs);
    }
   for (int i=imaxabs+1; i<iminabs; i++)
  {
      arrmult*=pchMessage[i];
  }
   sprintf_s(pchResponse, "%f", arrsum);
   nMessageLength = strlen(pchResponse) + 1;
  // cout<<pchResponse<< endl;
  // отвечаем клиенту
  if (!WriteFile(
    hNamedPipe,      // дескриптор канала
    pchResponse,      // адрес буфера для вывода данных
    nMessageLength,  // количество записываемых байтов
    &dwBytesWrite,   // количество записанных байтов
    NULL             // передача данных синхронная
    ))
  {
    cerr << "Write file failed." << endl
      << "The last error code: " << GetLastError() << endl;
    CloseHandle(hNamedPipe);
    cout << "Press any key to exit.";
    cin.get();
 
    return 0;
  }
 
  // выводим посланное клиенту сообщение на консоль
  cout << "The server sent the message to a client: "
    << endl << '\t' << pchResponse << endl;
 
  // закрываем дескриптор канала 
  CloseHandle(hNamedPipe);
  // завершаем процесс
  cout << "Press any key to exit.";
  cin.get();
 
  return 0;
}
2
0 / 0 / 0
Регистрация: 08.10.2017
Сообщений: 12
22.05.2019, 12:05
можете рассказать как это сделать и где?
0
 Аватар для hebdo
-10 / 4 / 1
Регистрация: 20.05.2019
Сообщений: 16
22.05.2019, 13:47
Проще всего с Borland C++ 5.02, после установки, (если ОС x64 !!!) открыть консоль: Win+R,
дать команду: del c:\windows\system\bivbx31n.exe Команды (выполнять от Admina)
после этого поправить в настройках шрифт, чтобы русские отображались, запустить средства разработки из
этого пакета
Проект для Borland C++ 5.02.zip

Второй вариант установить Microsoft Visual C++
здесь версия для неё
Проект для Visual Studio (начиная с 6.0).zip
0
 Аватар для hebdo
-10 / 4 / 1
Регистрация: 20.05.2019
Сообщений: 16
22.05.2019, 14:08
сборка проекта Borland C++


сборка проекта Visual Stidio
0
22.05.2019, 15:29

Не по теме:

Как прекрасен winapi - посмотрииии

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.05.2019, 15:29
Помогаю со студенческими работами здесь

Конструкторы,передача сообщений объектам и реакции объектов на сообщения в С++
Привет всем! Тему чуть-чуть понимаю,но задачу сделать не могу, вы не могли бы мне помочь с этим? вот задача:Создаваемый объект должен...

Передача системного времени через pipe
Всем привет, пишу программу, дочерний процесс должен передать системное время родительскому процессу через pipe, но в чем-то ошибка. Буду...

Передача считанного файла через pipe
прошу помощи разобраться с чтением файла и передачей прочитанных данных через анонимный pipe сам смысл задачи:программа запускается из...

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

Передача сообщений через TCP/IP
Доброго времени суток. При разработке программы, столкнулся с двумя типами логики приложения при передаче сообщения: 1) Connect -&gt;...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера 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, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru