CreatePipe proto pReadHandle:DWORD, \
pWriteHandle:DWORD, \
pPipeAttributes:DWORD, \
nBufferSize:DWORD
pReadHandle – це вказівник на змінну типу DWORD, котрий отримає дескриптор кінця читання каналу.
pWriteHandle - це вказівник на змінну типу DWORD, котрий отримає дескриптор кінця запису каналу.
pPipeAttributes – вказує на структуру SECURITY_ATTRIBUTES
Додаток 6
Детальний опис функції створення іменованого каналу
CreateNamedPipe proto lpName:DWORD,\; вказує на ім’я файлу
dwOpenMode:DWORD, \; режим відкриття каналу
dwPipeMode:DWORD, \; pipe-specific modes
nMaxInstances:DWORD,\;максимальна кількість екземплярів каналу
nOutBufferSize: DWORD, \;розмір буферу для виводу
nInBufferSize: DWORD,\;розмір буферу для вводу
nDefaultTimeOut: DWORD,\; час тривання екземпляра каналу
lpSecurityAttributes LPSECURITY_ATTRIBUTES <>;вказівник на структуру безпеки
Параметр lpName вказує на стрічку, котра завершується нулем і має наступний вигляд: \\.\pipe\pipename. Ім’я каналу не повинно перевищувати 256 символів.
Параметр dwOpenMode має наступні типи:
PIPE_ACCESS_DUPLEX – канал має двонаправлений тип. Клієнт та сервер можуть читати та записувати з каналу. Цей режим дає серверу такий самий як GENERIC_READ | GENERIC_WRITE доступ до каналу. Клієнт може встановити параметри GENERIC_READ або GENERIC_WRITE, або обидва, під час під’єднання до каналу функцією CreateFile.
|
|
PIPE_ACCESS_INBOUND - Потік даних направлений тільки від клієнта до сервера. Цей режим дає серверу такий самий доступ до каналу як GENERIC_READ. Клієнт – програма повинна мати GENERIC_WRITE доступ до каналу..
PIPE_ACCESS_OUTBOUND – Потік даних напрямлений тільки від сервера до клієнта. Цей режим дає серверу такий самий доступ до каналу як GENERIC_WRITE. Клієнт – програма повинна мати GENERIC_READ доступ до каналу..
Параметр dwPipeMode визначає параметри запису, параметри очікування.
PIPE_TYPE_BYTE – Діні записуються у канал як потік байтів.
PIPE_TYPE_MESSAGE - Діні записуються у канал як потік повідомлень
PIPE_WAIT - Встановлено режим очікування. В цьому режимі функції ReadFile, WriteFile, або ConnectNamedPipe не виконуються поки є дані для зчитування, дані для запису або до каналу під’єднаний клієнт.
PIPE_NOWAIT – Знято режим очікування.
Параметр nMaxInstances визначає максимальну кількість екземплярів каналу, може бути встановленим у PIPE_UNLIMITED_INSTANCES – необмежена кількість екземплярів каналу.
Дана функція повертає дескриптор на екземпляр іменованого файлу програми- сервера. У випадку помилки функція повертає INVALID_HANDLE_VALUE. За допомогою функції GetLastError можна дізнатись номер помилки, по якому можна знайти причину її виникнення. Помилка ERROR_INVALID_PARAMETER виникає у випадку коли параметр nMaxInstances є більшим ніж PIPE_UNLIMITED_INSTANCES.
Додаток 7
Текст програми створення сервера,що отримує повідомлення від клієнт – програми за допомогою іменованих каналів.
|
|
;----------------------------------
; Server.asm
;----------------------------------
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
include \masm32\include\masm32.inc
includelib \masm32\lib\masm32.lib
wsprintfA PROTO C:DWORD,:VARARG
wsprintf equ <wsprintfA>
.data
PIPE_TIMEOUT DWORD 0
fConnected DWORD 0
dwThreadId DWORD 0
lpszPipename db "\\.\pipe\mypipename",0
MsgCaption db "Сервер - програма",0
ErrCreatePipe db "Error create pipe",0
ErrPipeCount db "Error connect pipe",0
ErrCreateThread db "Error create thread", 0
chRequest db 256 dup(0)
theEnter db 0ah, 0dh, 0
buffer db 256 dup (?)
parameter db "%u"
.data?
hPipe HANDLE?
hThread HANDLE?
.const
BUFSIZE DWORD 256
.code
InstanceThread PROC Param:DWORD
LOCAL cbBytesRead:DWORD
mov eax, Param
mov hPipe, eax
invoke ReadFile, \
hPipe, \
addr chRequest, \
BUFSIZE, \
addr cbBytesRead,\
NULL
invoke StdOut, addr chRequest
invoke StdOut, addr theEnter
invoke FlushFileBuffers, hPipe
invoke DisconnectNamedPipe, hPipe
invoke CloseHandle, hPipe
ret
InstanceThread ENDP
start:
invoke SetConsoleTitle, addr MsgCaption
.while TRUE
invoke CreateNamedPipe,\
addr lpszPipename,\ ;PipeName
PIPE_ACCESS_DUPLEX, \ ;read access
PIPE_TYPE_MESSAGE + PIPE_READMODE_MESSAGE + PIPE_WAIT,\
;blocking mode
PIPE_UNLIMITED_INSTANCES, \;max instances
BUFSIZE, \ ;output buffer size
BUFSIZE, \ ;input buffer size
PIPE_TIMEOUT,\ ;client time-out
NULL ;no security atribute
mov hPipe,eax
.if hPipe==INVALID_HANDLE_VALUE
invoke StdOut,addr ErrCreatePipe
invoke StdOut, addr theEnter
.endif
invoke ConnectNamedPipe, hPipe, NULL
mov fConnected, eax
.if fConnected==ERROR_PIPE_CONNECTED
invoke StdOut, addr ErrPipeCount
invoke StdOut, addr theEnter
.break
.endif
.if fConnected!= NULL
invoke CreateThread,\
NULL,\ ;No security attribute
0,\ ;Default stack size
addr InstanceThread,\;Addr thread proc
hPipe,\ ;Thread parameter
0, \ ;Not suspended
addr dwThreadId ;Returns thread ID
.if eax == INVALID_HANDLE_VALUE
invoke StdOut,addr ErrCreateThread
invoke StdOut,addr theEnter
.endif
.else
invoke CloseHandle,hPipe
.endif
.endw
exit:
invoke ExitProcess,NULL
end start
Примітка: сервер – прграму потрібно лінкувати та транслювати як консольну програму. Windows 9x не підтримує іменованих каналів.
Додаток 8
Текст клієнт - програми передачі повідомлення програмі - серверу.
;----------------------------------
; Client.asm
;----------------------------------
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
include \masm32\include\masm32.inc
includelib \masm32\lib\masm32.lib
wsprintfA PROTO C:DWORD,:VARARG
wsprintf equ <wsprintfA>
.data
cbWritten DWORD 0
MyLength DWORD 0
dwMode DWORD 0
lpszPipename db "\\.\pipe\mypipename",0
MsgCaption db "Message!",0
ErrOpenPipe db "Error oрen pipe", 0
ErrSetState db "Error set cannal state",0
ErrWriteFile db "Error write pipe",0
ErrCreateFile db "Error connect pipe",0
Message db "Hello from client to server program!",0
theTitle db "Дана програма вiдiшле програмi - серверу повiдомлення ",0
buffer db 256 dup (?)
parameter db "%u"
.data?
hPipe DWORD?
.code
start:
invoke MessageBox, NULL, addr theTitle, addr MsgCaption, MB_OK
invoke CreateFile,\
addr lpszPipename,\;pipe name
GENERIC_WRITE, \ ;write access
0, ;no sharing
NULL, \ ;no security atribute
OPEN_EXISTING, \ ;open existing file
0, \ ;default attributes
NULL ;no template file
mov hPipe,eax
.if hPipe==INVALID_HANDLE_VALUE
invoke GetLastError
invoke wsprintf,addr buffer,addr parameter,eax
invoke MessageBox, NULL, addr ErrCreateFile,\
addr buffer,MB_ICONERROR + MB_OK
jmp exit
.endif
invoke WaitNamedPipe,addr lpszPipename,100
.if eax == 0
invoke MessageBox, NULL, addr ErrOpenPipe,\
|
|
addr MsgCaption,MB_ICONERROR + MB_OK
jmp exit
.endif
mov eax,PIPE_READMODE_MESSAGE
mov dwMode,eax
invoke SetNamedPipeHandleState,\
hPipe,\
addr dwMode,\
NULL,\
NULL
.if eax == 0
invoke MessageBox, NULL, addr ErrSetState,\
addr MsgCaption,MB_ICONERROR + MB_OK
.endif
invoke lstrlen, addr Message
mov MyLength,eax
invoke WriteFile, \
hPipe, \
addr Message, \
MyLength,\
addr cbWritten,\
NULL
.if!eax
invoke GetLastError
invoke wsprintf,addr buffer,addr parameter,eax
invoke MessageBox, NULL, addr ErrWriteFile,\
addr buffer,MB_ICONERROR + MB_OK
.endif
invoke CloseHandle, hPipe
exit:
invoke ExitProcess,NULL
end start
Результат виконання сервер – програми:
Результат виконання клієнт - програми:
Вид консольного вікна сервер – програми після передачі йому повідомлення
від клієнт - програми:
Опис взаємодії сервер та клієнт – програми: Під час завантаження сервер – програма створює іменований канал за допомогою функції CreateNamedPipe у випадку успішного створення каналу, за допомогою функції ConnectNamedPipe, програма буде очікувати на під’єднання до неї прграми – клієнта. У випадку успішного під’єднання сервер - програма створює новий потік, котрий за допомогою функції ReadFile буде зчитувати дані з каналу.
Клієнт - програма відкриває канал за допомогою функції CreateFile використовуючи параметр OPEN_EXISTING, після успішного відкриття каналу, клієнт – програма встановлює стан каналу та записує у нього відповідне повідомлення, котре потрібно передати програмі - серверу.
Додаток 9