программа с анонимными каналами WINAPI
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
программа с анонимными каналами WINAPI - 2009-04-08 00:51:02.090000
|
|
|
Dezmont_
Сообщений: 21
Оценки: 0
Присоединился: 2008-12-18 01:29:18.740000
|
Вот задание № 2. Создайте программы, в которых стандартный ввод-вывод перенаправляется в анонимный канал, а для обмена данными по анонимному каналу используются перегруженные операторы ввода-вывода С++. Должны быть следующие программы: программа процесса-сервера анонимного канала. Эта программа создает двух клиентов анонимного канала и прекращает работу. Программы двух клиентов представляют собой: 1. Программу процесс-клиента, записывающего данные в анонимный канал; 2. Программу процесс-клиента, читающего данные из анонимного канала. Программа процесс-сервера создает клиентов и передает им дескрипторы анонимного канала через поля структуры STARTUPINFO. вот код сервера который я написал #include <cstdlib>
#include <iostream>
#include <windows.h>
#include <conio.h>
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<<"descriptor "<<((int)hInheritWritePipe)<<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<<"Devil"<<endl;
// читаем из анонимного канала
for (int i = 0; i < 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 <cstdlib>
#include <iostream>
#include <windows.h>
#include <conio.h>
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 < 12; i++)
{
cout<<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]
|
|
|
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
|
|
|
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
|
|
|
RE: программа с анонимными каналами WINAPI - 2009-04-08 22:20:26.270000
|
|
|
Dezmont_
Сообщений: 21
Оценки: 0
Присоединился: 2008-12-18 01:29:18.740000
|
Че то я все равно ничего не понял. Мне кажется все это не то и слишком сложно. Страуструп пишет про классы. а у меня то классов нет. И вообще нам как таковое задание дать не могли, скорей всего что то гораздо проще. Там задание вообще на анонимный поток. Ввод вывод производиться в стандартные файлы. Ну как я понял вот эти стандартные файлы и сндартные потоки связываются с дескриптором, который я передаю в структуре STURPUPINFO. В программе у меня вроде как куда- то записыватся но не считывает.
|
|
|
RE: программа с анонимными каналами WINAPI - 2009-04-09 12:02:16.956666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Ты про то, что такое перегрузка операторов почитал? Стандартный поток аля std::iostream - это ни что иное, как КЛАСС. Читай ссылку, которую я тебе дал. Но если ты не знаешь, что такое ООП и классы в си++ - то ты долго промучаешься. Надо было всё сначала учить :).
|
|
|
RE: программа с анонимными каналами WINAPI - 2009-04-30 21:20:53.880000
|
|
|
Gear51
Сообщений: 1
Оценки: 0
Присоединился: 2009-04-30 21:10:55.093333
|
Дезмонт = ) Ты сцуко = ) делай лабораторные по СИППО самостоятельно = )
|
|
|
RE: программа с анонимными каналами WINAPI - 2009-04-30 22:03:21.270000
|
|
|
amega
Сообщений: 40
Оценки: 0
Присоединился: 2008-04-30 22:11:25.380000
|
quote:
Дезмонт = ) Ты сцуко = ) делай лабораторные по СИППО самостоятельно = ) гг) ты ежжай на Украину там уже ввели платные отработки за прогулы лаб, дак не тока лабы научися сам делать а еще и заплатиш немножко))
|
|
|
|
|