Детальний опис функції створення анонімного каналу

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: