Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631

Функция GetNamedPipeHandleState

20.03.2022, 02:29. Показов 1141. Ответов 1

Студворк — интернет-сервис помощи студентам
Здравствуйте! Не знаю почему, код не собирается, пример с функцией GetNamedPipeHandleState().

Кликните здесь для просмотра всего текста
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
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
#include <windows.h>
#include <iostream>
//#include <string>
 
using namespace std;
 
int main()
{
    HANDLE   hNamedPipe;
    SECURITY_ATTRIBUTES sa;    // атрибуты безопасности
    SECURITY_DESCRIPTOR sd;    // дескриптор безопасности
    DWORD   dwBytesRead;       // дл¤ количества прочитанных байтов
    DWORD  dwBytesWrite;       // дл¤ количества записанных байтов
    char  pchMessage[80];      // дл¤ сообщени¤
    int  nMessageLength;       // длина сообщени¤
 
    // инициализаци¤ атрибутов безопасности
    sa.nLength = sizeof(sa);
    sa.bInheritHandle = FALSE;   // дескриптор канала ненаследуемый
    // инициализируем дескриптор безопасности
    InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
    // разрешаем доступ к именованному каналу всем пользовател¤м
    SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);
    sa.lpSecurityDescriptor = &sd;
 
    // создаем именованный канал дл¤ чтени¤ и записи
    hNamedPipe = CreateNamedPipeA(
        "\\\\.\\pipe\\demo_pipe",      // им¤ канала
        PIPE_ACCESS_DUPLEX,    // читаем из канала и пишем в канал
        PIPE_TYPE_MESSAGE | PIPE_WAIT, // синхронна¤ передача сообщений
        1,         // максимальное количество экземпл¤ров канала 
        0,         // размер выходного буфера по умолчанию
        0,         // размер входного буфера по умолчанию
        INFINITE,  // клиент ждет св¤зь бесконечно долго
        &sa        // доступ дл¤ всех пользователей
    );
    // провер¤ем на успешное создание
    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;
    }
 
    // выводим полученное от клиента сообщение на консоль
    cout << "The server received the message from a client: "
        << endl << '\t' << pchMessage << endl;
 
    // вводим строку
    cout << "Input a string: ";
    cin.getline(pchMessage, 80);
    // определ¤ем длину строки
    nMessageLength = strlen(pchMessage) + 1;
 
    // отвечаем клиенту
    if (!WriteFile(
        hNamedPipe,    // дескриптор канала
        pchMessage,    // адрес буфера дл¤ вывода данных
        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' << pchMessage << endl;
 
    // закрываем дескриптор канала 
    CloseHandle(hNamedPipe);
    // завершаем процесс
    cout << "Press any key to exit.";
    cin.get();
 
    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
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
#include <windows.h>
#include <iostream>
//#include <string>
 
using namespace std;
 
int main()
{
    char  machineName[80];
    char  pipeName[80];
    HANDLE   hNamedPipe;
 
    DWORD  dwState;              // состо¤ние канала
    DWORD  dwCurInstances;       // количество экземпл¤ров канала
    DWORD  dwMaxCollectionCount; // размер буфера клиента канала
    DWORD  dwCollectDataTimeout; // задержка перед передачей данных
    char  chUserName[255];      // им¤ владельца именованного канала
 
    // вводим им¤ машины в сети, на которой работает сервер
    cout << "Enter a name of the server machine: ";
    cin >> machineName;
    cin.get();
    // подставл¤ем им¤ машины в им¤ канала
    sprintf_s(pipeName, "\\\\%s\\pipe\\demo_pipe", machineName);
 
    // св¤зываемс¤ с именованным каналом
    hNamedPipe = CreateFileA(
        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;
    }
 
    // определ¤ем состо¤ние канала
    if (!GetNamedPipeHandleStateA(
        hNamedPipe,            // дескриптор именованного канала
        &dwState,              // состо¤ние именованного канала
        &dwCurInstances,       // количество экземпл¤ров канала
        &dwMaxCollectionCount, // размер буфера клиента канала 
        &dwCollectDataTimeout, // макс. задержка перед передачей данных
        chUserName,            // им¤ пользовател¤ канала
        255))                  // максимальна¤ длина имени
    {
        cerr << "Get named pipe handle state failed." << endl
            << "The last error code: " << GetLastError() << endl;
        cout << "Press any key to exit.";
        cin.get();
 
        return 0;
    }
 
    // выводим состо¤ние канала на консоль
    cout << "State: ";
    switch (dwState)
    {
    case (PIPE_NOWAIT):
        cout << "PIPE_NOWAIT" << endl;
        break;
    case (PIPE_READMODE_MESSAGE):
        cout << "PIPE_READMODE_MESSAGE" << endl;
        break;
    case (PIPE_NOWAIT | PIPE_READMODE_MESSAGE):
        cout << "PIPE_NOWAIT and PIPE_READMODE_MESSAGE" << endl;
        break;
    default:
        cout << "Unknown state." << endl;
        break;
    }
 
    cout << "Current instances: " << dwCurInstances << endl
        << "Max collection count: " << dwMaxCollectionCount << endl
        << "Collection data timeout: " << dwCollectDataTimeout << endl
        << "User name: " << chUserName << endl;
 
    // закрываем дескриптор канала
    CloseHandle(hNamedPipe);
    // завершаем процесс
    cout << "Press any key to exit.";
    cin.get();
 
    return 0;
}


На приглашение клиента ввести имя компьютера ввожу имя компьютера и, собственно всё, на стороне клиента получаю ошибку 1, а на стороне сервера ошибку 109. Я так понимаю функция GetNamedPipeHandleState должна получить состояние канала сервера, пробовал закомментировать ввод\вывод сообщений в коде сервера, но тогда либо сервер виснет доходя до cout << "The server is waiting for connection with a client." << endl; , либо завершается т.е. на стороне клиента ошибка, а на стороне сервера сообщение cout << "Press any key to exit."; и, собственно, всё. Что здесь не так, поясните, пожалуйста?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.03.2022, 02:29
Ответы с готовыми решениями:

Задана показательная функция. Проверить, является ли функция возрастающей или убывающей
Задана показательная функция y=a^x. Проверить, является ли функция возрастающей ( при a&gt;1)или убывающей (при 0 ≤ a ≤ 1)....

Функция поиска в массиве и указатели + функция сортировки и поиск найденного элемента
Написать функцию поиска максимального элемента, передать в неё указатель на начало и конец поиска и возвращать указатель на найденный...

Базовый интерфейс, функция вывода звука, функция для просчёта выражения
ОЧЕНЬ НУЖНА ПОМОЩЬ! Нужно реализовать программу, которая по нажатию клавиши, а после &quot;enter&quot; выполняла такие функции: ...

1
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
21.03.2022, 01:24  [ТС]
Тогда переформулирую вопрос: Как вообще работает функция GetNamedPipeHandleState? Описание я читал, но видимо саму суть не уловил. Ясно, что она должна показать свойства именованного канала, но....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.03.2022, 01:24
Помогаю со студенческими работами здесь

Функция слияния двух строк и функция подсчёта предложений в строке
Определить класс-строку. В класс включить два конструктора: для определения класса строки строкой символов и путем копирования другой...

Почему данная функция не работает? .функция avg(money) не существует
Функция должна вывести услуги близкие к средней стоимости: Вот мой код /plpgsql CREATE FUNCTION average_prices_for_services () RETURNS...

Функция sqrt: существует более одного экземпляра. Функция перегруженная
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;iomanip&gt; using namespace std; int main(){ float s, p; int c, a; s=0; ...

Перегрузка операций: friend-функция или функция-член класса
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и friend. Вот к примеру такой код. class...

Функция удаления текста в скобках [2], непосредственно функция + 12кб вложений
Доброго времени суток, случилось так, что пришлось работать с с-строками (лаба, угу), в которой нужно удалить весь текст в скобках,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru