С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.67
Сестра_Ветра
0 / 0 / 0
Регистрация: 21.04.2011
Сообщений: 91
#1

Передача данных при помощи pipe - C++

05.01.2012, 19:37. Просмотров 3317. Ответов 0
Метки нет (Все метки)

Смысл в том, что можно создать одно приложение (соответственно, один проект). При первом запуске приложение будет играть роль сервера, при втором – роль клиента. Помимо этого нужно обеспечить, чтобы прием сообщений шел параллельно с отправкой. Для осуществления последнего нужно использовать потоки. Тогда в основном потоке вы будете отправлять сообщения, а в дополнительном – «слушать» входящие сообщения и отображать их на экране.
У меня же два проекта. Помогите исправить.

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
//первый проект
#include <windows.h>
#include <stdio.h>
#include <conio.h>
BOOL fConnected;                                         // Флаг успешного создания канала
HANDLE hNamedPipe;                                       // Идентификатор канала Pipe
LPCWSTR lpszPipeName = L"\\\\.\\pipe\\$MyFirstPipe";     // Имя создаваемого канала 
char szBuf[512];                                         // Буфер для приема данных из канала
char message[256];                                       //сообщение
DWORD cbWritten;                                         // Количество байт, переданных через канал
DWORD cbRead;                                            // Количество байт данных, принятых через канал
 
int main()
{
// Создаем канал Pipe с именем lpszPipeName
hNamedPipe = CreateNamedPipe (
lpszPipeName, 
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
512,
512, 
5000, 
NULL );
 
// Если возникла ошибка, завершаем работу приложения
//
if (hNamedPipe == INVALID_HANDLE_VALUE)
{
    printf ("Error Pipe Creating!!!\n");
    getch();
    return 0;
}
 
// Ожидаем соединения со стороны клиента
fConnected = ConnectNamedPipe(hNamedPipe, NULL);
 
// Если возникла ошибка, завершаем работу приложения
//
if  (!fConnected)
{
    printf ("Error Pipe Connecting!!!\n");
    CloseHandle (hNamedPipe);
    getch();
    return 0;
}
 
// Получение данных из канала
//
while (true)
{
    if (ReadFile(hNamedPipe, szBuf, 512, &cbRead, NULL))
        printf ("Received %d bytes: <%s>\n", cbRead, szBuf);
    printf ("Input message \n");
    scanf  ("%s", message);
    strcpy (szBuf, message);
    if  (!WriteFile(hNamedPipe, szBuf, strlen(szBuf) + 1, &cbWritten, NULL))
        printf("Error Data Transfer!!!\n");     // Если произошла ошибка, выдаем сообщение
    else 
        printf("Transferred %d bytes: <%s>\n", cbWritten, szBuf);
}
 
CloseHandle (hNamedPipe);
getch();
return 0;
}
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
//второй проект
#include <windows.h>
#include <stdio.h>
#include <conio.h>
HANDLE hNamedPipe;                                   // Идентификатор канала Pipe
DWORD cbWritten;                                     // Количество байт, переданных через канал
char szBuf[256];                                     // Буфер для передачи данных
char message[256];                                   // Сообщение
DWORD cbRead;                                        // Количество байт данных, принятых через канал
LPCWSTR lpszPipeName = L"\\\\.\\pipe\\$MyFirstPipe"; // Имя создаваемого канала
 
int main()
{
    // Установка соединения с процессом PIPES
hNamedPipe = CreateFile (lpszPipeName, 
    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL, 
    OPEN_EXISTING, 
    0, 
    NULL);
 
// Если возникла ошибка, завершаем работу приложения
//
if  (hNamedPipe == INVALID_HANDLE_VALUE) 
{
    printf("Error Pipe Creating!!!\n");
    getch();
    return 0;
}
 
// Передача данных 
//
while (true)
{
    printf ("Input message \n");
    scanf  ("%s", message);
    strcpy (szBuf, message);
    if  (!WriteFile(hNamedPipe, szBuf, strlen(szBuf) + 1, &cbWritten, NULL))
        printf("Error Data Transfer!!!\n");      // Если произошла ошибка, выдаем сообщение
    else 
        printf("Transferred %d bytes: <%s>\n", cbWritten, szBuf);
    if  (ReadFile(hNamedPipe, szBuf, 512, &cbRead, NULL))
        printf  ("Received %d bytes: <%s>\n", cbRead, szBuf);
}
CloseHandle (hNamedPipe);                // Закрываем идентификатор канала
getch();
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2012, 19:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача данных при помощи pipe (C++):

Русификация при помощи класса. - C++
Всем привет! Требуется Ваша помощь в создании файла описания класса для русификации консольной программы. Например есть код (Взято из...

Нарисовать елку при помощи рекурсии - C++
помогите пожалуйста нарисовать елочку при помощи рекурсии...

Проверка при помощи вложенных блоков try - C++
Посчитать уравнение ( у=log4(x2-4)+1/x)при вводе х с клавиатуры, но должны выполнятся условия: 1. выражение считается в отдельной...

Обработка массивов при помощи процедур - C++
Не знаю как написать код к программе. Написать программу для вычисления T=(Q_1-Q_2)+e^{Q_1-Q_2} , где Q-количество элементов вектора...

Решите при помощи двумерного массива - C++
Дан массив целых чисел.Выяснить: 1) верно ли, что максимальный элемент превышает минимальный не более чем на 25; 2) верно ли, что...

Не производиться ввод при помощи функции gets(s) - C++
По непонятной мне причине не производиться ввод при помощи функции gets(s) или getline(cin, s). Если использовать просто cin, то проблем...

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

Синхронизация процессов при помощи мьютексов - C++
начал разбираться с мбютексами, а точнее как синхронизировать 2 рпоцесса с их помощью. #include &lt;stdlib.h&gt; #include &lt;semaphore.h&gt; ...

Отсортировать массив по возрастанию при помощи указателей - C++
Знаю как это сделать, при помощи индексирования элементов, но не могу указателями. Можете привести пример. массив int и сортировка например...

как усовершенствовать студ.актив при помощи С++ - C++
Учусь на первом курсе, если честно, не особо смыслю в программировании :) Веду активную жизнь, состою в студенческом активе, по этому...

Найти сумму ряда (при помощи цикла while) - C++
Помогите решить задачу... мозг уже устал. Решить нужно с помощью цикла с предусловием while Пусть...


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

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

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