Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
2 / 2 / 1
Регистрация: 18.11.2015
Сообщений: 84
1

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

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

Прошу помочь с реализацией курсового проекта. Я очень плохо шарю в c++, поэтому ничего не могу понять( Нужно через pipe реализовать следующие задачи:
В одномерном массиве, состоящем из η вещественных элементов, вычислить:
1) максимальный элемент массива;
2) сумму элементов массива, расположенных до последнего положительного эле¬мента.
Сжать массив, удалив из него все элементы, модуль которых находится в интервале [а,b]. Освободившиеся в конце массива элементы заполнить нулями.
Сложность в том, что нужно создать два консольных приложения client и server.
Client отправляет массив, server получает его, обрабатывает и отправляет клиенту ответ.
Заранее спасибо всем, кто поможет или хотя бы попытается)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2018, 17:24
Ответы с готовыми решениями:

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

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

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

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

8
Модератор
3318 / 2105 / 337
Регистрация: 13.01.2012
Сообщений: 8,177
11.11.2018, 19:50 2
vany200397, вы про собственно pipe читали? Мысли есть?
0
2 / 2 / 1
Регистрация: 18.11.2015
Сообщений: 84
11.11.2018, 19:51  [ТС] 3
Я уже решил задачу. Можно закрывать, спасибо
0
Модератор
3318 / 2105 / 337
Регистрация: 13.01.2012
Сообщений: 8,177
12.11.2018, 06:26 4
vany200397, это оч хорошо, остальным покажете во имя добра)?
0
2 / 2 / 1
Регистрация: 18.11.2015
Сообщений: 84
12.11.2018, 07:22  [ТС] 5
Лучший ответ Сообщение было отмечено 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 6
можете рассказать как это сделать и где?
0
-10 / 4 / 1
Регистрация: 20.05.2019
Сообщений: 16
22.05.2019, 13:47 7
Проще всего с 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
-10 / 4 / 1
Регистрация: 20.05.2019
Сообщений: 16
22.05.2019, 14:08 8
сборка проекта Borland C++
Передача сообщений через pipe


сборка проекта Visual Stidio
Передача сообщений через pipe
0
Вованя
22.05.2019, 15:29     Передача сообщений через pipe
  #9

Не по теме:

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

0
22.05.2019, 15:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2019, 15:29
Привет! Вот еще темы с ответами:

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

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

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

Передача сообщений через TCP/IP
Доброго времени суток. При разработке программы, столкнулся с двумя типами логики приложения при...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.