Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

программа с анонимными каналами WINAPI

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> программа с анонимными каналами WINAPI
Имя
Сообщение << Старые топики   Новые топики >>
программа с анонимными каналами WINAPI - 2009-04-08 00:51:02.090000   
Dezmont_

Сообщений: 21
Оценки: 0
Присоединился: 2008-12-18 01:29:18.740000
Вот задание
№ 2. Создайте программы, в которых стандартный ввод-вывод перенаправляется в анонимный канал, а для обмена данными по анонимному каналу используются перегруженные операторы ввода-вывода С++. Должны быть следующие программы: программа процесса-сервера анонимного канала. Эта программа создает двух клиентов анонимного канала и прекращает работу. Программы двух клиентов представляют собой: 1. Программу процесс-клиента, записывающего данные в анонимный канал;
2. Программу процесс-клиента, читающего данные из анонимного канала. Программа процесс-сервера создает клиентов и передает им дескрипторы анонимного канала через поля структуры STARTUPINFO.

вот код сервера который я написал
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;conio.h&gt; using namespace std; int main(int argc, char *argv[]) { char lpszComLine[80]="..//2//Project2.exe"; // для командной строки STARTUPINFO si; PROCESS_INFORMATION pi; HANDLE hWritePipe, hReadPipe, hInheritWritePipe; // создаем анонимный канал if(!CreatePipe( &hReadPipe, // дескриптор для чтения &hWritePipe, // дескриптор для записи NULL, // атрибуты защиты по умолчанию, в этом случае // дескрипторы hReadPipe и hWritePipe ненаследуемые 0)) // размер буфера по умолчанию { _cputs("Create pipe failed.\n"); _cputs("Press any key to finish.\n"); _getch(); return GetLastError(); } // делаем наследуемый дубликат дескриптора hWritePipe if(!DuplicateHandle( GetCurrentProcess(), // дескриптор текущего процесса hWritePipe, // исходный дескриптор канала GetCurrentProcess(), // дескриптор текущего процесса &hInheritWritePipe, // новый дескриптор канала 0, // этот параметр игнорируется TRUE, // новый дескриптор наследуемый DUPLICATE_SAME_ACCESS )) // доступ не изменяем { _cputs("Duplicate handle failed.\n"); _cputs("Press any key to finish.\n"); _getch(); return GetLastError(); } // закрываем ненужный дескриптор CloseHandle(hWritePipe); ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.hStdOutput=hInheritWritePipe; si.dwFlags=STARTF_USESTDHANDLES; //cout&lt;&lt;"descriptor "&lt;&lt;((int)hInheritWritePipe)&lt;&lt;endl; // запускаем новый консольный процесс if (!CreateProcess( NULL, // имя процесса lpszComLine, // командная строка NULL, // атрибуты защиты процесса по умолчанию NULL, // атрибуты защиты первичного потока по умолчанию TRUE, // наследуемые дескрипторы текущего процесса // наследуются новым процессом CREATE_NEW_CONSOLE, // новая консоль NULL, // используем среду окружения процесса предка NULL, // текущий диск и каталог, как и в процессе предке &si, // вид главного окна - по умолчанию &pi // здесь будут дескрипторы и идентификаторы // нового процесса и его первичного потока )) { _cputs("Create process failed.\n"); _cputs("Press any key to finish.\n"); _getch(); return GetLastError(); } // закрываем дескрипторы нового процесса CloseHandle(pi.hProcess); CloseHandle(pi.hThread); // закрываем ненужный дескриптор канала CloseHandle(hInheritWritePipe); HANDLE hEvent; hEvent=CreateEvent(NULL,FALSE,FALSE,"MyEvent"); if(hEvent==NULL) cout&lt;&lt;"Devil"&lt;&lt;endl; // читаем из анонимного канала for (int i = 0; i &lt; 12; i++) {WaitForSingleObject(hEvent,INFINITE); int nData; DWORD dwBytesRead; if (!ReadFile( hReadPipe, &nData, sizeof(nData), &dwBytesRead, NULL)) { _cputs("Read from the pipe failed.\n"); _cputs("Press any key to finish.\n"); _getch(); return GetLastError(); } _cprintf("The number %d is read from the pipe.\n", nData); } // закрываем дескриптор канала CloseHandle(hReadPipe); _cputs("The process finished reading from the pipe.\n"); _cputs("Press any key to exit.\n"); _getch(); system("PAUSE"); return EXIT_SUCCESS; }

ну а вот 1 клиент
///////////////////////////////////клиент #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;conio.h&gt; using namespace std; int main(int argc, char *argv[]) { HANDLE hWritePipe; HANDLE hEvent=OpenEvent(EVENT_ALL_ACCESS,FALSE,"MyEvent"); _cputs("Press any key to start communication.\n"); _getch(); // пишем в анонимный канал for (int i = 0; i &lt; 12; i++) { cout&lt;&lt;i; DWORD dwBytesWritten; /* if (!WriteFile( hWritePipe, &i, sizeof(i), &dwBytesWritten, NULL)) { _cputs("Write to file failed.\n"); _cputs("Press any key to finish.\n"); _getch(); return GetLastError(); }*/ // _cprintf("%d", i); Sleep(500); SetEvent(hEvent); } // закрываем дескриптор канала CloseHandle(hWritePipe); _cputs("The process finished writing to the pipe.\n"); _cputs("Press any key to exit.\n"); _getch(); // return 0; //} system("PAUSE"); return EXIT_SUCCESS; } И вот как изменить клиент что бы было по заданию
что бы для обмена еще и использовалась перегрузка оператов ввода \вывода?
Как я понял в канал надо записывать и считывать не используя WriteFile и ReadFile.
Ну у меня ничего не выходит[sm=ak.gif][sm=ak.gif]
Post #: 1
RE: программа с анонимными каналами WINAPI - 2009-04-08 10:44:14.046666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Man, ты пытаешься писать на Си, а перегрузка операторов - это си++. Советую запастись терпением, т.к. тема не из самых лёгких в с++. Ссылка в помощь: http://www.rsdn.ru/article/cpp/streams.xml
Post #: 2
RE: программа с анонимными каналами WINAPI - 2009-04-08 12:59:08.940000   
Zmaster

Сообщений: 930
Оценки: 0
Присоединился: 2007-02-09 19:02:43.500000
И почитай еще Страуструпа (автор C++) на эту тему: http://nen.name/books/cpp_2/index.php?p=g7
Post #: 3
RE: программа с анонимными каналами WINAPI - 2009-04-08 22:20:26.270000   
Dezmont_

Сообщений: 21
Оценки: 0
Присоединился: 2008-12-18 01:29:18.740000
Че то я все равно ничего не понял.
Мне кажется все это не то и слишком сложно. Страуструп пишет про классы. а у меня то классов нет.
И вообще нам как таковое задание дать не могли, скорей всего что то гораздо проще. Там задание вообще на анонимный поток.
Ввод вывод производиться в стандартные файлы.
Ну как я понял вот эти стандартные файлы и сндартные потоки связываются с дескриптором, который я передаю в структуре STURPUPINFO.
В программе у меня вроде как куда- то записыватся но не считывает.
Post #: 4
RE: программа с анонимными каналами WINAPI - 2009-04-09 12:02:16.956666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Ты про то, что такое перегрузка операторов почитал? Стандартный поток аля std::iostream - это ни что иное, как КЛАСС. Читай ссылку, которую я тебе дал. Но если ты не знаешь, что такое ООП и классы в си++ - то ты долго промучаешься. Надо было всё сначала учить :).
Post #: 5
RE: программа с анонимными каналами WINAPI - 2009-04-30 21:20:53.880000   
Gear51

Сообщений: 1
Оценки: 0
Присоединился: 2009-04-30 21:10:55.093333
Дезмонт = ) Ты сцуко = ) делай лабораторные по СИППО самостоятельно = )
Post #: 6
RE: программа с анонимными каналами WINAPI - 2009-04-30 22:03:21.270000   
amega

Сообщений: 40
Оценки: 0
Присоединился: 2008-04-30 22:11:25.380000
quote:

Дезмонт = ) Ты сцуко = ) делай лабораторные по СИППО самостоятельно = )


гг) ты ежжай на Украину там уже ввели платные отработки за прогулы лаб, дак не тока лабы научися сам делать а еще и заплатиш немножко))
Post #: 7
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> программа с анонимными каналами WINAPI







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.