2.2. kỹ thuật lập trình mailslots

32
1 2.2. Kỹ thuật lập trình MAILSLOTS Tổng quan về Mailslots Kỹ thuật Lập trình Mailslots Các vấn đề khác

Upload: nydia

Post on 19-Mar-2016

88 views

Category:

Documents


0 download

DESCRIPTION

2.2. Kỹ thuật lập trình MAILSLOTS. Tổng quan về Mailslots Kỹ thuật Lập trình Mailslots Các vấn đề khác. 2.2.1 Tổng quan về Mailslots. Là 1 kỹ thuật trong cơ chế truyền thông liên tiến trình (IPC). Cơ chế truyền thông của Mailslots là 1 chiều Client --> Server. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 2.2. Kỹ thuật lập trình MAILSLOTS

1

2.2. Kỹ thuật lập trình MAILSLOTS

Tổng quan về Mailslots

Kỹ thuật Lập trình Mailslots

Các vấn đề khác

Page 2: 2.2. Kỹ thuật lập trình MAILSLOTS

2

2.2.1 Tổng quan về Mailslots

• Là 1 kỹ thuật trong cơ chế truyền thông liên tiến trình (IPC).• Cơ chế truyền thông của Mailslots là 1 chiều Client --> Server.• Dựa trên kiến trúc Broadcast là chính.• Lập trình dựa vào các tập tin Win32 API: ReadFile, WriteFile, CreateFile để gởi và nhận dữ liệu.• Dựa vào bộ điều hướng để nhận dạng những Mailslots dùng hệ thống tập tin Mailslot File System.

Page 3: 2.2. Kỹ thuật lập trình MAILSLOTS

3

2.2.1 Tổng quan về Mailslots

a. Đặt tên cho Mailslot: Mailslots dùng quy ước đặt tên như sau:

\\ server\ Mailslot\ [path] name Server: tên của máy chủ nơi Mailslots được tạo ra và nơi mà ứng dụng máy chủ đang chạy. Mailslot: là một chuỗi bắt buộc thông báo tên tập tin này phụ thuộc vào hệ thống MSFS. [path] name: cho phép các ứng dụng định nghĩa tên duy nhất của Mailslots.

Page 4: 2.2. Kỹ thuật lập trình MAILSLOTS

4

2.2.1 Tổng quan về Mailslots

Ví dụ: Một số định danh hợp lệ

\\Oreo\Mailslot\Mymailslot\\Testserver\Mailslot\Cooldirectory\Funtest\Anothermailslot\\.\Mailslot\Easymailslot\\*\Mailslot\Myslot

Phần chuỗi tên của máy chủ có thể mô tả bởi dấu chấm (.), dấu hoa thị (*), là một tên vùng hay tên máy chủ

Page 5: 2.2. Kỹ thuật lập trình MAILSLOTS

5

2.2.1 Tổng quan về Mailslots

Mailslots dựa vào những dịch vụ của hệ thống tập tin Windows trong việc tạo và truyền dữ liệu qua mạng --> độc lập giao thức.dựa vào bộ điều hướng Windows để gởi dữ liệu từ máy khách đến máy chủ dựa vào giao thức mạng SMB. Các thông điệp được gởi thông qua cơ chế không kết nối (datagram)… Tuy nhiên Windows NT, 2000, XP có thể buộc Bộ Điều Hướng truyền theo hướng kết nối khi kích thước thông điệp lớn.

Page 6: 2.2. Kỹ thuật lập trình MAILSLOTS

6

2.2.1 Tổng quan về Mailslots

b. Định kích thước thông điệp Mailslots thường dùng cơ chế datagram để truyền thông điệp qua mạng --> có thể truyền thông điệp từ một máy tính đến nhiều máy chủ.Đối với Windows NT, 2000, XP khi thông điệp > 424 byte --> truyền theo cơ chế hướng kết nối qua một Session SMB --> truyền đáng tin cậy, nhưng điều này sẽ mất đi khả năng truyền Broadcast.

Page 7: 2.2. Kỹ thuật lập trình MAILSLOTS

7

2.2.1 Tổng quan về Mailslots

b. Định kích thước thông điệp Do Windows NT, 2000 thay đổi cách truyền dựa vào kích thước thông điệp --> phát sinh khi gởi các thông điệp kích thước lớn giữa máy đang chạy Windows NT, 2000 cho một máy chạy Windows 95, 98.

Khi Windows 95, 98 gởi một thông điệp >424 byte đến một máy Windows 2000, NT thì máy này chỉ nhận 424 byte đầu mà thôi.

Page 8: 2.2. Kỹ thuật lập trình MAILSLOTS

8

2.2.1 Tổng quan về Mailslots

Transfer Direction Connectionless Transfer via Datagrams

Connection-Oriented Transfer

Windows 95, 98->Windows 95, 98

Message size up to 64 KB. Not supported

Windows NT, 2000-> Windows NT , 2000

Messages must be 424 bytes or less.

Messages must be greater than 426 bytes

Windows NT, 2000-> Windows 95, 98

Messages must be 424 bytes or less.

Not supported

Windows 95, 98-> Windows NT, 2000

Messages must be 424 bytes or less; otherwise, the message is truncated

Not supported

Page 9: 2.2. Kỹ thuật lập trình MAILSLOTS

9

2.2.2 Lập trình với Mailslots

Page 10: 2.2. Kỹ thuật lập trình MAILSLOTS

10

2.2.2 Lập trình với Mailslots

Tính năng của Mailslots dựa vào kiến trúc khách/chủ đơn giản cho phép dữ liệu có thể truyền từ máy khách --> máy chủ. Mô hình truyền thông dữ liệu là một chiều, hay theo một hướng duy nhất. Máy chủ chịu trách nhiệm tạo ra một Mailslots và là tiến trình duy nhất có thể đọc dữ liệu từ nó. Các máy khách dùng Mailslots là các tiến trình mở thể hiện của Mailslots và là các tiến trình duy nhất có thể ghi dữ liệu vào đó.

Page 11: 2.2. Kỹ thuật lập trình MAILSLOTS

11

2.2.2 Lập trình với Mailslots

a. Cài đặt chi tiết Mailslots trên máy chủ1. Tạo một Mailslots dùng hàm API CreateMailslot.2. Nhận dữ liệu bất kỳ từ máy khách nào gởi đến

bằng cách gọi hàm API ReadFile dùng handle mailslot.

3. Đóng handle mailslot dùng hàm API CloseHandle.

Page 12: 2.2. Kỹ thuật lập trình MAILSLOTS

12

2.2.2 Lập trình với Mailslots

Hàm CreateMailslot, được định nghĩa như sau:

HANDLE CreateMailslot( LPCTSTR lpName,DWORD nMaxMessageSize,DWORD lReadTimeout,LPSECURITY_ATTRIBUTES  lpSecurityAttributes );

Page 13: 2.2. Kỹ thuật lập trình MAILSLOTS

13

2.2.2 Lập trình với Mailslots - Tham số lpName chỉ định tên Mailslots, tên phải

có dạng sau:\\.\ Mailslots \ [path] name

(dấu chấm, mô tả máy cục bộ. Tham số này là tên duy nhất có thể là tên hay đường dẫn thư mục đầy đủ )

Page 14: 2.2. Kỹ thuật lập trình MAILSLOTS

14

2.2.2 Lập trình với Mailslots

- Tham số nMaxMessageSize, định nghĩa kích thước tối đa (tính bằng byte) của một thông điệp có thể được ghi vào Mailslot. - Nếu một máy khách ghi nhiều hơn số byte nMaxMessageSize, máy chủ sẽ không thấy thông điệp. - Việc chỉ định giá trị 0 cho phép máy chủ chấp nhận một thông điệp với kích thước bất kỳ.

Page 15: 2.2. Kỹ thuật lập trình MAILSLOTS

15

2.2.2 Lập trình với Mailslots   - Các thao tác đọc có thể thực hiện theo kiểu chờ

(block) hay không chờ (none - block) trên một Mailslot, phụ thuộc vào tham số lReadTimeout tham số này quyết định khoảng thời gian (tính theo mili giây) mà thao tác đọc chờ các thông điệp gởi đến.-Việc chỉ định giá trị MAILSLOT_WAIT_FOREVER cho phép các thao tác đọc chờ vô hạn cho đến khi dữ liệu nhập có sẵn để đọc vào. - Nếu chỉ định là 0 thì các thao tác đọc sẽ trả về ngay lập tức.

Page 16: 2.2. Kỹ thuật lập trình MAILSLOTS

16

2.2.2 Lập trình với Mailslots

   - Tham số lpSecurityAttributes quyết định quyền điều khiển truy nhập đến một Mailslot. - Trên Windows 95, 98 tham số này phải là null, vì không thể áp dụng cơ chế bảo mật cho đối tượng, - Còn trên Windows NT, 2000 tham số này chỉ được cài đặt một phần, vì vậy cũng nên gán cho nó giá trị null luôn.

Page 17: 2.2. Kỹ thuật lập trình MAILSLOTS

17

2.2.2 Lập trình với Mailslots

    - Sau khi một Mailslots được tạo với handle hợp lý, ta có thể bắt đầu đọc dữ liệu. - Máy chủ là tiến trình duy nhất có thể đọc dữ liệu từ một Mailslot. - Máy chủ có thể dùng hàm ReadFile của Win32 để cài đặt tiến trình này.

Page 18: 2.2. Kỹ thuật lập trình MAILSLOTS

18

2.2.2 Lập trình với Mailslots

-    ReadFile được định nghĩa như sau:BOOL ReadFile(    HANDLE hFile,    LPVOID lpBuffer,    DWORD nNumberOfBytesToRead,     LPDWORD lpNumberOfBytesRead,     LPOVERLAPPED lpOverlapped);

Page 19: 2.2. Kỹ thuật lập trình MAILSLOTS

19

2.2.2 Lập trình với Mailslots

    - CreateMailslot trả về handle hFile.- Các tham số lpBuffer và nNumberOfBytesToRead quyết định số lượng dữ liệu có thể đọc khỏi Mailslot. - Quan trọng là tạo kích thước của vùng đệm này lớn hơn tham số nMaxMessageSize từ lời gọi CreateMailslot. - Ngoài ra, vùng đệm phải lớn hơn các thông điệp gởi đến Mailslot, nếu không ReadFile sẽ báo lỗi.

Page 20: 2.2. Kỹ thuật lập trình MAILSLOTS

20

2.2.2 Lập trình với Mailslots

   Tham số lpNumberOfBytesRead cho biết số lượng các Byte thực sự được đọc khi thao tác ReadFile hoàn thành. Tham số lpOverlapped cung cấp cách đọc dữ liệu không đồng bộ của một Mailslot, dùng cơ chế I/O Overlapped của Win32. Mặc định thao tác ReadFile chờ thao tác I/O cho đến khi dữ liệu có thể đọc. I/O Overlapped có thể được cài trên Windows NT và 2000, ta có thể gán giá trị null cho tham số này khi dùng Windows 95, 98.

Page 21: 2.2. Kỹ thuật lập trình MAILSLOTS

21

2.2.2 Lập trình với Mailslots #include <windows.h>#include <stdio.h> void main(void){    HANDLE Mailslot;    char buffer[256];    DWORD NumberOfBytesRead;     

//Create the mailslot    if ((Mailslot = CreateMailslot ( "\\\\.\\Mailslot\\Myslot", 0, MAILSLOT_WAIT_FOREVER, NULL)) == INVALID_HANDLE_VALUE)    {  printf("Failed to create a mailslot %d\n", GetLastError());        return;    }     // Read data from the mailslot forever!    while(ReadFile(Mailslot, buffer, 256, &NumberOfBytesRead,     NULL) != 0) {        printf("%.*s\n", NumberOfBytesRead, buffer);    }}

Page 22: 2.2. Kỹ thuật lập trình MAILSLOTS

22

2.2.2 Lập trình với Mailslots b. Cài đặt Mailslot trên máy khách Gồm việc tham chiếu và ghi dữ liệu vào mailslot đang tồn tại.

Các bước xây dựng ứng dụng máy khách cơ bản:    1. Mở một handle tham chiếu đến Mailslot mà chúng

muốn gởi dữ liệu đến bằng CreateFile.      2. Ghi dữ liệu vào Mailslot bằng cách gọi hàm

WriteFile.3. Khi việc ghi dữ liệu hoàn tất, đóng handle Mailslot bằng hàm CloseHandle.

Page 23: 2.2. Kỹ thuật lập trình MAILSLOTS

23

2.2.2 Lập trình với Mailslots Các Mailslot được tham chiếu bằng việc dùng hàm CreateFile, hàm này được định nghĩa như sau:HANDLE CreateFile(   LPCTSTR lpFileName,    DWORD dwDesiredAccess,    DWORD dwShareMode,     

LPSECURITY_ATTRIBUTES lpSecurityAttributes,     DWORD dwCreationDisposition,     DWORD dwFlagsAndAttributes,     HANDLE hTemplateFile);

Page 24: 2.2. Kỹ thuật lập trình MAILSLOTS

24

2.2.2 Lập trình với Mailslots

- Tham số lpFileName mô tả một hay nhiều Mailslots có thể được ghi dữ liệu bằng việc dùng định dạng tên Mailslot.

- - Tham số dwDesiredAccess phải được thiết lập bằng GENERIC_WRITE do một máy khách chỉ có thể ghi dữ liệu đến máy chủ .- Tham số dwShareMode phải được thiết lập bằng FILE_SHARE_READ, cho phép máy chủ mở và thực hiện thao tác đọc trên mailslot.

Page 25: 2.2. Kỹ thuật lập trình MAILSLOTS

25

2.2.2 Lập trình với Mailslots

- Tham số lpSecurityAttributes thiết lập null.- Cờ dwCreationDisposition có thể được thiết lập bằng OPEN_EXISTING, thiết lập này cần thiết khi một máy khách và máy chủ được cài đặt trên cùng một máy. Nếu máy chủ không tạo Mailslot, hàm CreateFile sẽ báo lỗi. - Tham số dwCreationDisposition này không có tác dụng đối với máy chủ ở xa.- Tham số dwFlagsAndAttributes có thể được định nghĩa là FILE_ATTRIBUTE_NORMAL.- Tham số hTemplateFile có thể thiết lập bằng null.

Page 26: 2.2. Kỹ thuật lập trình MAILSLOTS

26

2.2.2 Lập trình với Mailslots

Sau khi một handle được tạo thành công, ta có thể bắt đầu ghi dữ liệu vào một Mailslot, bằng hàm WriteFile được định nghĩa như sau:BOOL WriteFile(    HANDLE hFile,    LPCVOID lpBuffer,    DWORD nNumberOfBytesToWrite,    LPDWORD lpNumberOfBytesWritten,    LPOVERLAPPED lpOverlapped);

Page 27: 2.2. Kỹ thuật lập trình MAILSLOTS

27

2.2.2 Lập trình với Mailslots

- Tham số hFile là handle tham chiếu mà CreateFile trả về. - Tham số lpBuffer và nNumberOfBytesToWrite quyết định bao

nhiêu byte sẽ được gởi từ máy khách đến máy chủ, kích thước tối đa gói tin là 64 KB. Nếu handle Mailslot được tạo ra dùng định dạng domain hay dấu *, kích thước gói tin được giới hạn đến 424 byte trên Windows NT và Windows 2000, còn đối với Windows 95, 98 là 64 KB. Nếu một máy khách cố gởi một gói tin vượt quá giới hạn đó, hàm WriteFile sẽ báo lỗi. Điều này xảy ra bởi vì gói tin được gởi như một datagram thông báo đến tất cả các máy chủ trên mạng.

Page 28: 2.2. Kỹ thuật lập trình MAILSLOTS

28

2.2.2 Lập trình với Mailslots

- - Tham số lpNumberOfBytesWritten trả về số lượng Byte được gởi đến máy chủ khi thao tác WriteFile hoàn thành.- Tham số lpOverlapped cung cấp cơ chế ghi dữ liệu không đồng bộ đến một Mailslot. Do tính năng Mailslot là sử dụng cơ chế truyền dữ liệu không kết nối, hàm WriteFile sẽ không chờ. Tham số này có thể thiết lập null trên máy khách..

Page 29: 2.2. Kỹ thuật lập trình MAILSLOTS

29

2.2.2 Lập trình với Mailslots #include <windows.h>#include <stdio.h> void main(int argc, char *argv[]){    HANDLE Mailslot;    DWORD BytesWritten;    CHAR ServerName[256];     // Accept a command line argument for the server to send  a message to    if (argc < 2)    {        printf("Usage: client <server name>\n");        return;    }     sprintf(ServerName, "\\\\%s\\Mailslot\\Myslot", argv[1]);     if ((Mailslot = CreateFile(ServerName ,  GENERIC_WRITE, ,  FILE_SHARE_READ,  NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,  NULL)) == INVALID_HANDLE_VALUE)    { printf("CreateFile failed with error %d\n", GetLastError());        return;    }     if (WriteFile(Mailslot, "This is a test", 14, &BytesWritten,         NULL) == 0)    {        printf("WriteFile failed with error %d\n", GetLastError());        return;    }     printf("Wrote %d bytes\n", BytesWritten);     CloseHandle(Mailslot);}

Page 30: 2.2. Kỹ thuật lập trình MAILSLOTS

30

2.2.3 Các vấn đề khác Một ứng dụng máy chủ dùng Mailslot có thể dùng hai hàm API tương tác với Mailslot là GetMailslotInfo và SetMailslotInfo. Hàm GetMailslotInfo rút trích thông tin kích thước gói tin khi các gói tin sẵn sàng trên Mailslot. Các ứng dụng có thể dùng hàm này để điều chỉnh linh động vùng đệm của nó cho các gói tin có chiều dài khác nhau. GetMailslotInfo cũng có thể được dùng để thăm dò dữ liệu gởi đến.

Page 31: 2.2. Kỹ thuật lập trình MAILSLOTS

31

2.2.3 Các vấn đề khác Hàm SetMailslotInfo thiết lập giá trị thời gian chờ trên một Mailslot cho phép thao tác đọc chờ các gói tin gởi đến. Do đó ứng dụng có khả năng thay đổi cách đọc dữ liệu từ kiểu chờ (block) sang kiểu không chờ (none - block) hay ngược lại. Hàm này được định nghĩa như sau:

Page 32: 2.2. Kỹ thuật lập trình MAILSLOTS

32

2.2.3 Các vấn đề khác

Hiệu suất thực thi và các phiên bản Windows 95, 98- Giới hạn về tên ký tự

- Không có khả năng huỷ bỏ các yêu cầu I/O đang trong trạng thái chờ

- Rò rỉ bộ nhớ khi hết thời gian chờ