1 / 32

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

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.

nydia
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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

  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.

  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.

  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ủ

  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.

  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.

  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.

  8. 2.2.1 Tổng quan về Mailslots

  9. 2.2.2 Lập trình với 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 đó.

  11. 2.2.2 Lập trình với Mailslots a. Cài đặt chi tiết Mailslots trên máy chủ Tạo một Mailslots dùng hàm API CreateMailslot. 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. Đóng handle mailslot dùng hàm API CloseHandle.

  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 );

  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 đủ )

  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ỳ.

  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.

  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.

  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.

  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 );

  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.

  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.

  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);     } }

  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.

  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 );

  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.

  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.

  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 );

  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.

  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..

  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);}

  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.

  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:

  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ờ

More Related