Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы 60-79.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
28.11 Кб
Скачать

Void main()

{

HANDLE hp;

hp=CreateNamedPipe("\\\\.\\pipe\\ipctest",PIPE_ACCESS_OUTBOUND,

PIPE_TYPE_BYTE | PIPE_NOWAIT,1,0,0,NMPWAIT_USE_DEFAULT_WAIT,NULL);

if (hp!=INVALID_HANDLE_VALUE)

{

int i;

cin >> i;

}

else cout << "Error Create Name Pipe " << endl;

}

А теперь клиент:

// CreateFile.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include "windows.h"

#include "iostream.h"

Void main()

{

HANDLE hp;

hp=CreateFile("\\\\Server\\pipe\\ipctest", GENERIC_READ,

FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hp!=INVALID_HANDLE_VALUE)

{

int i;

cin >> i;

}

else cout << "Error pipe" << endl;

}

68. Как видите для создание канала надо вызвать функцию CreateNamedPipe, а для клиента создать файл указав сервер Server. Вы должны указывать свой сервер. То есть его имя в домене. А имя \\pipe\\ipctest должно совпадать и в клиенте и в сервере. Это имя канала.

69. Функция ReadFile читает данные из файла, начиная с позиции, обозначенной указателем файла. После того, как операция чтения была закончена, указатель файла перемещается на число действительно прочитанных байтов, если дескриптор файла не создан с атрибутом асинхронной операции. Если дескриптор файла создается для асинхронного ввода - вывода, приложение должно переместить позицию указателя файла после операции чтения.

Эта функция предназначена и для синхронной и асинхронной операции. Функция ReadFileEx предназначена исключительно для асинхронной операции. Это дает возможность приложению выполнять другие действия в ходе операции чтения файла.

Синтаксис

BOOL ReadFile(

HANDLE hFile, // дескриптор файла

LPVOID lpBuffer, // буфер данных

DWORD nNumberOfBytesToRead, // число байтов для чтения

LPDWORD lpNumberOfBytesRead, // число прочитанных байтов

LPOVERLAPPED lpOverlapped // асинхронный буфер

);

70

72. Чтение и запись в поименованный канал

#include <fcntl.h> char string[] = "hello"; main(argc,argv) int argc; char *argv[]; { int fd; char buf[256]; /* создание поименованного канала с разрешением чтения и записи для всех пользователей */ mknod("fifo",010777,0); if(argc == 2) fd = open("fifo",O_WRONLY); else fd = open("fifo",O_RDONLY); for (;;) if(argc == 2) write(fd,string,6); else read(fd,buf,6); }

73. MailSlot - это файл, который находится в памяти, и Вы можете используете стандартные файловые функции Win32, чтобы иметь доступ к нему. Данные в mailslot могут быть в любой форме, но общий размер не может быть больше 64K. В отличие от дисковых файлов, файлы MailSlot временные. Когда все указатели на MailSlot закрываются, MailSlot и все данные, которые он содержит, удаляются. Есть два вида программ использующих данную возможность:

MailSlot сервер

MailSlot клиент

MailSlot cервер - является процессом, который создает и, обладает MailSlot. Когда сервер создает MailSlot, он получает указатель. Этот указатель должен использоваться, когда процесс читает сообщения от MailSlot. Только процесс, который создает MailSlot или получил указатель некоторым другим механизмом может прочитать данные из MailSlot. Все MailSlot локальные на процессе, который создает их; процесс не может создать дистанционный MailSlot.

MailSlot Клиент - является процессом, который пишет сообщение в MailSlot. Любой процесс, который имеет имя MailSlot может записать в него информацию.

Для создания почтовых слотов используются имена. При создании имя должно быть в следующей форме.

\\.\mailslot\[path]name

Обратите внимание на то, что только локально можно создавать почтовый слот. А вот использоваться можно любые почтовые слоты. Форма имени при открытии почтового слота.

\\ComputerName\mailslot\[path]name

или

\\DomainName\mailslot\[path]name