Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обучение VC++ / ЛекцииИнтернетС++ / Лекция_лаб_практикум.doc
Скачиваний:
64
Добавлен:
16.02.2016
Размер:
932.35 Кб
Скачать

Пример 12. Использование именованного канала.

Программа передаёт и считывает из канала строку символов "hello". И сервер и клиент функционируют в одном процессе.

#include <vcl.h>

#pragma hdrstop

#pragma argsused

#include <stdio.h>

int main(int argc, char* argv[])

{

DWORD dwWRriten;

DWORD dwErrorCode;

bool tt;

HANDLE hNamedPipe = CreateNamedPipe(

"\\\\.\\pipe\\PipeFile", //name pipe

PIPE_ACCESS_DUPLEX, // pipe open mode

PIPE_TYPE_BYTE | PIPE_NOWAIT, // pipe-specific modes

1, // maximum number of instances

100, // output buffer size, in bytes

100, // input buffer size, in bytes

100, // time-out time, in milliseconds

NULL);

//Вторая точка канала клиент

HANDLE hClientPipe=CreateFile(

"\\\\.\\pipe\\PipeFile", // pointer to name of the file

GENERIC_READ | GENERIC_WRITE, // access (read-write) mode

FILE_SHARE_READ |FILE_SHARE_WRITE,

NULL, // pointer to security attributes

OPEN_EXISTING , // how to create

FILE_ATTRIBUTE_SYSTEM, // file attributes

0 // handle to file with attributes to copy

);

char chInBuf[]="Hello";

char chOutBuf[100];

WriteFile(hNamedPipe,chInBuf,sizeof(chInBuf),&dwWRriten,NULL); //запись в канал

ReadFile(hClientPipe,chOutBuf,sizeof(chInBuf),&dwWRriten,NULL)) ; //чтение из канала

printf("NamedPipe declared %s",chOutBuf);

CloseHandle(hNamedPipe); // handle to object

getchar();

return 0;

}

Пример 13. Использование разделяемой памяти File Mapping.

Процесс1 создаёт File Mapping присоединяется нему и пересылает в память 10 чисел. Процесс 2 присоединяется к тому же File Mapping читает и выводит записанные числа.

process1.cpp

#include <vcl.h>

#pragma hdrstop

#pragma argsused

int main()

{

unsigned char *pview,i;

LPMSG msg;

HANDLE hfilemap;

hfilemap=CreateFileMapping(NULL,NULL,PAGE_READWRITE,0,10,"lpName");

pview=(unsigned char *)MapViewOfFile(hfilemap,FILE_MAP_ALL_ACCESS,0,0,0);

for (i = 1; i<=10; i++)

{*pview=i; pview++;}

// Ожидает закрытия окна

while (GetMessage(msg, NULL, 0, 0))

DispatchMessage(msg);

}

process2.cpp

#include <vcl.h>

#include <stdio.h>

//#pragma hdrstop

//#pragma argsused

int main(int argc, char* argv[])

{

HANDLE hMapFile;

unsigned char* pbyte,i;

hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,"lpName");

pbyte=(unsigned char*)MapViewOfFile(hMapFile, // Handle to mapping object.

FILE_MAP_ALL_ACCESS, // Read/write permission.

0, // Max. object size.

0, // Size of hFile.

0); // Map entire file.

for (i=1;i<=10;i++)

printf("%d\n",*pbyte++);

getchar();

}

Пример 14. Использование Mailslot.

Сервер создаёт Mailslot и ждёт сообщения, клиент подключается к Mailslot и посылает сообщение.

Server.cpp

#include <vcl.h>

#include <stdio.h>

#pragma hdrstop

#pragma argsused

int main(int argc, char* argv[])

{

DWORD dwErrorCode, cbMessage, cMessage=0,dwRead;

char chOutBuf[100];

HANDLE hMailslot;

hMailslot=CreateMailslot(

"\\\\.\\mailslot\\mailslotFile",

0,

0,

NULL

);

for(;cMessage==0;)

GetMailslotInfo(

hMailslot,

(LPDWORD) NULL, // no maximum message size

&cbMessage, // size of next message

&cMessage, // number of messages

(LPDWORD) NULL // no read time-out

);

ReadFile(hMailslot,chOutBuf,cbMessage,&dwRead,NULL);

printf("Mailslot declared %s",chOutBuf);

CloseHandle(hMailslot); // handle to object

getchar();

return 0;

}

Client.cpp

#include <vcl.h>

#include <stdio.h>

#pragma hdrstop

#pragma argsused

int main(int argc, char* argv[])

{

DWORD dwWrite;

char chOutBuf[]="Pass Message from Mailfile";

HANDLE hMailslot;

hMailslot = CreateFile("\\\\.\\mailslot\\mailslotFile",

GENERIC_WRITE,

FILE_SHARE_READ, // required to write to a mailslot

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

NULL);

bool fResult = WriteFile(hMailslot,

chOutBuf,

(DWORD) lstrlen(chOutBuf) + 1, // include terminating null

&dwWrite,

(LPOVERLAPPED) NULL);

getchar();

return 0;

}