Chuyên đề Lập trình mạng trên máy pocket PC

TRƯỜNG ĐẠI HỌC SƯ PHẠM TP.HCM KHOA TOÁN – TIN BỘ MÔN TIN TRẦN THANH PHƯỚC LẬP TRÌNH MẠNG TRÊN MÁY POCKET PC Giáo viên hướng dẫn : Th.s : HOÀNG THÂN ANH TUẤN TP.HCM, 2006. Lời cảm ơn Sau gần sáu tháng làm việc cật lực cuối cùng thì em cũng đã hoàn thành được luận văn tốt nghiệp của mình. Mặc dù kiến thức trong luận văn này chỉ là một phần nhỏ trong kho tàng kiến thức của chuyên đề lập trình mạng trong môi trường Pocket PC nhưng đối với em đó là một thành tựu tuyệt

pdf90 trang | Chia sẻ: huong20 | Ngày: 07/01/2022 | Lượt xem: 250 | Lượt tải: 0download
Tóm tắt tài liệu Chuyên đề Lập trình mạng trên máy pocket PC, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
vời. Đó là thành quả của gần sáu tháng trời nghiên cứu học tập. Và xa hơn nữa chính là kết quả của bốn năm đèn sách dưới mái trường Đại Học Sư Phạm. Có được dù thành tựu dù không lớn lao nhưng nó cũng đã thể hiện phần nào sự quyết tâm gắng của bản thân cũng như sự chỉ bảo tận tình của các thầy cô đã dạy bảo em trong suốt thời gian học vừa qua. Em xin chân thành cảm ơn đến tất cả các thầy cô trong trong Khoa Toán Tin đặc biệt là Tổ Bộ môn Tin Học đã tận tình chỉ bảo truyền đạt những kinh nghiệm kiến thức cho chúng em để chúng em có được những cơ sở kiến thức cần thiết hoàn thành luận văn này. Những kỷ niệm những ân tình mà thầy Quang Tấn thầy Ngọc Trung thầy Bảo.... đối với chúng em sẽ mãi là những kỷ niệm đẹp chúng em sẽ mãi không bao giờ quên. Vượt lên trên cả em xin chân thành cảm ơn thầy Hoàng Thân Anh Tuấn thầy đã hướng dẫn em hoàn thành tốt luận văn này. Thầy đã cung cấp cho em rất nhiều tài liệu hỗ trợ cũng như kinh nghiệm lập trình cần thiết để vượt qua những khó khăn do hạn chế về chuyên môn cũng như kinh nghiệm lập trình của bản thân em. Mặc dù thầy có rất nhiều công việc nhưng mỗi lần chúng em gặp những vướng mắc thầy luôn sẵn sàng gặp mặt để giúp đỡ dù đó là những lúc không phải là giờ gặp chính thức giữa thầy hướng dẫn và người làm luận văn. Tuy đã rất cố gắng nhằm đạt được những gì tốt nhất cho luận văn này nhưng do kiến thức có hạn nên luận văn này nhất định sẽ có những khiếm khuyết cần được sửa chữa. Kính mong các thầy cô cùng các bạn đọc thông cảm và nhiệt tình đóng góp những ý kiến nhằm khắc phục những khiếm khuyết của luận văn. Qua đó em sẽ củng -1- cố lại kiến thức của mình khắc phục lại những sai lầm cũ làm cho luận văn này được mới mẽ hơn hữu ích hơn. Một lần nữa em xin gửi lời cảm ơn đến tất cả các thầy cô đã dạy bảo em trong suốt thời gian qua. Sự dạy bảo đóng góp của các thầy cô chính là những nền tảng cơ bản nhất giúp chúng em có đủ tự tin trên bước đường hoàn thiện kiến thức của mình. -2- Mục lục Chương2T 12T Giới2T thiệu về đề tài.2T ...................................................................................... 6 1.1.2T 2T Cơ2T sở của đề tài :2T ............................................................................................... 6 1.2.2T 2T Mục2T tiêu của đề tài :2T .......................................................................................... 6 1.3.2T 2T Phạm2T vi của đề tài :2T ........................................................................................... 6 1.4.2T 2T Cấu2T trúc của luận văn :2T ...................................................................................... 7 Chương2T 22T Khảo2T sát những vấn đề kỹ thuật liên quan2T ................................................... 8 2.1.2T 2T Máy2T tính Pocket PC :2T ......................................................................................... 8 2.1.12T 2T Định2T nghĩa :2T .................................................................................................. 8 2.1.22T 2T Một2T vài khái niệm về phần cứng Pocket PC :2T .............................................. 8 2.2.2T 2T Pocket2T PC Emulator (2003) :2T ......................................................................... 11 2.2.12T 2T Định2T nghĩa Emulator:2T ................................................................................. 11 2.2.22T 2T Sử2T dụng Emulator :2T .................................................................................... 11 2.2.32T 2T Các2T yêu cầu cho Emulator: 2T ........................................................................ 11 2.2.42T 2T Định2T cấu hình Emulator: 2T ............................................................................ 12 2.2.52T 2T Tắt2T Emulator:2T ............................................................................................. 16 2.2.62T 2T Nh2T ững hạn chế của Emulator:2T .................................................................... 16 2.3.2T 2T Sơ2T lược về mạng :2T ............................................................................................ 17 2.3.12T 2T Nguồn2T đích và các gói dữ liệu :2T ................................................................ 17 2.3.22T 2T Môi2T trường truyền dẫn : 2T ............................................................................. 18 2.3.32T 2T Giao2T thức :2T .................................................................................................. 18 2.3.42T 2T Mô2T hình tham chiếu OSI :2T .......................................................................... 19 2.3.52T 2T Sự2T đóng gói dữ liệu :2T .................................................................................. 21 2.4.2T 2T Lập2T trình mạng :2T .............................................................................................. 23 2.4.12T 2T Liên2T lạc trên Internet :2T ................................................................................ 23 -3- 2.4.22T 2T Dịch2T vụ từ phía máy chủ và khái niệm cổng (PORT):2T .............................. 26 2.4.32T 2T Giao2T tiếp trên mạng theo mô hình khách/chủ (client/server) và khái niệm Socket:2T 27 2.4.42T 2T Lập2T trình mạng thông qua Socket :2T ............................................................ 28 Chương2T 32T Lập2T trình mạng trên môi trường Pocket PC2T ............................................... 29 3.1.2T 2T Cài2T đặt các phần mềm cần thiết:2T ...................................................................... 29 3.1.12T 2T Cài2T đặt eMbedded Visual C++ 4.02T ............................................................. 29 3.1.22T 2T Cài2T đặt eVC4SP3.2T ...................................................................................... 31 3.1.32T 2T Cài2T đặt Pocket PC 2003 SDK.2T ................................................................... 33 3.1.42T 2T Cài2T đặt Emulator:2T ....................................................................................... 35 3.1.52T 2T Cài2T đặt LoopBack Adapter.2T ........................................................................ 37 3.1.62T 2T Cấu2T hình mạng:2T .......................................................................................... 40 3.2.2T 2T Các2T bước xây dựng một ứng dụng mạng trên máy Pocket PC2T ....................... 43 3.2.12T 2T Xây2T dựng dịch vụ trên Server :2T .................................................................. 44 3.2.22T 2T Xây2T dựng ứng dụng trên Client :2T ................................................................ 45 3.3.2T 2T Chi2T tiết các hàm sử dụng trong từng bước2T ...................................................... 45 3.3.12T 2T Sử2T dụng API:2T .............................................................................................. 45 3.3.22T 2T Sử2T dụng MFC:2T ............................................................................................ 61 Chương2T 42T Ứng2T dụng minh họa2T .................................................................................... 69 4.2T 1.2T Mô2T tả ứng dụng minh họa:2T .............................................................................. 69 4.1.12T 2T Ứng2T dụng chat giữa Pocket PC với máy tính để bàn:2T ................................ 69 4.1.22T 2T Ứng2T dụng điều khiển Power Point:2T ............................................................ 69 4.2.2T 2T Chi2T tiết các hàm liên quan đến ứng dụng:2T ....................................................... 70 4.3.2T 2T Mô2T tả hoạt động của ứng dụng minh họa.2T ....................................................... 72 4.3.12T 2T Ứng2T dụng chat giữa Pocket PC với máy tính để bàn:2T ................................ 72 4.3.22T 2T Ứng2T dụng điều khiển Power Point:2T ............................................................ 73 4.4.2T 2T Mô2T tả thuộc tính phương thức chủ yếu của ứng dụng minh họa:2T ................... 74 -4- 4.4.12T 2T Ứng2T dụng chat giữa Pocket PC với máy tính để bàn:2T ................................ 74 4.4.22T 2T Ứng2T dụng điều khiển Power Point:2T ............................................................ 76 4.5.2T 2T Mô2T tả màn hình kết quả của ứng dụng2T ............................................................ 77 4.5.12T 2T Ứng2T dụng chat giữa Pocket PC với máy tính để bàn:2T ................................ 78 4.5.22T 2T Ứng2T dụng điều khiển Power Point:2T ............................................................ 80 Chương2T 52T Đánh2T giá đề tài và đề xuất hướng phát triển kế tiếp2T .................................. 82 5.1.2T 2T Những2T kết quả đã đạt được................................2T .............................................. 82 5.2.2T 2T Đề2T xuất hướng phát triển. 2T ................................................................................ 82 Danh2T mục tài liệu tham khảo.2T ........................................................................................ 83 Phụ2T lục.2T ........................................................................................................................... 84 -5- Chương 1 Giới0B thiệu về đề tài. 1.1. Cơ6BU sở của đề tài : Ngày nay với trình độ khoa học kĩ thuật phát triển cao các thiết bị điện tử hỗ trợ con người đã trở thành một vật dụng hữu ích và không thể thiếu như máy vi tính laptop điện thoại di động iPod Các thiết bị này có thể đáp ứng mọi nhu cầu của người dùng trong việc học tập giải trí thông tin liên lạc ở mọi lúc mọi nơi khi người dùng cần đến và có xu hướng phát triển rất nhanh. Một trong những thiết bị hữu ích trên mà tác giả muốn trình bày đó là PDA. Thiết bị này đang có xu hướng phát triển rất nhanh và mạnh. Trong phạm vi của luận văn này tác giả chỉ xem xét đến một loại của PDA là Pocket PC; đặc biệt là về môi trường lập trình mạng trên Pocket PC. 1.2. Mục7BU tiêu của đề tài :  Khảo sát việc lập trình trên máy Pocket PC bằng eVC++.  Xây dựng tài liệu tham khảo cho sinh viên về chủ đề lập trình mạng trên máy Pocket PC.  Xây dựng một ứng dụng nhỏ minh họa (chương trình chat giữa Pocket PC và máy tính để bàn hoặc chương trình điều khiển Power Point bằng Pocket PC). 1.3. Phạm8BU vi của đề tài : Như trên đã nói chủ đề của luận văn này là lập trình mạng trên máy Pocket PC. Do đó tác giả sẽ chỉ trình bày những kiến thức cơ bản nhất mà qua đó sinh viên có thể đọc hiểu và áp dụng vào việc tạo ra một ứng dụng mạng đơn giản giữa các Pocket PC hoặc giữa máy tính để bàn với Pocket PC. Cụ thể hơn tác giả sẽ trình bày những vấn đề sau đây: -6-  Giới thiệu về Pocket PC và Emulator.  Giới thiệu sơ lược về mạng và lập trình mạng.  Tìm hiểu cách xây dựng ứng dụng mạng đơn giản trên Pocket PC.  Xây dựng ứng dụng minh họa. 1.4. Cấu9BU trúc của luận văn :  Chương2T 1: Giới thiệu về đề tài. 2T Chương này trình bày những mục sau: Cơ sở đề tài mục tiêu đề tài phạm vi đề tài cấu trúc luận văn  Chương 2: Khảo sát những vấn đề kỹ thuật liên quan. Khảo sát những vấn đề sau: Tìm hiểu về máy tính Pocket PC trình giả lập Pocket PC Emulator 2003 tìm hiểu sơ lược về mạng tìm hiểu về lập trình mạng lập trình mạng thông qua socket.  Chương 3: Lập trình mạng trên môi trường Pocket PC. Chương này tìm hiểu các phần sau: Cài đặt các phần mềm cần thiết để có thể lập trình cho máy Pocket PC trên máy tính để bàn tìm hiểu các bước xây dựng một ứng dụng mạng trên máy Pocket PC nghiên cứu các chi tiết các hàm được sử dụng trong từng bước.  Chương 4: Ứng dụng minh họa bao gồm: Mô tả ứng dụng minh họa nghiên cứu các hàm có liên quan đến ứng dụng mô tả họat động của ứng dụng minh hoa trình bày các thành phần dữ liệu và các phương thức chủ yếu của ứng dụng mô tả màn hình kết quả của ứng dụng.  Chương 5: Đánh giá đề tài và đề xuất hướng phát triển kế tiếp. Chương này trình bày hai phần: Một là trình bày những kết quả đã đạt được hai là đề xuất hướng phát triển.  Danh mục tài liệu tham khảo: Trình bày những tài liệu tham khảo hỗ trợ cho việc hoàn thành luận văn này.  Phần Phụ lục: Trình bày ví dụ chat tuần tự minh họa cách sử dụng socket để lập trình mạng. -7- Chương 2 Khảo1B sát những vấn đề kỹ thuật liên quan 2.1. Máy10BU tính Pocket PC : 2.1.1 Định24B nghĩa : “Pocket” trong tiếng Anh có nghĩa là “túi” và “Pocket PC” có nghĩa là “máy vi tính bỏ túi” ý nói là thiết bị này cũng thông minh như PC nhưng rất nhỏ gọn có thể bỏ vào túi một cách vừa vặn tiện lợi. Hệ điều hành : Như trên đã nói Pocket PC cũng là một PC nên để Pocket PC chạy được nó cần phải có hệ điều hành. Pocket PC sử dụng Windows Mobile - sản phẩm độc quyền của Microsoft. Có thể xem hệ điều hành này là phiên bản thu nhỏ hệ điều hành Windows. Vì thế hầu hết người sử dụng khi dùng Pocket PC sẽ cảm thấy giao diện vô cùng quen thuộc. Cũng là các cửa sổ Windows cũng là nút Start để ra Menu cũng là Word Exel PowerPoint và Internet Explorer Hiện tại Windows Mobile cũ nhất còn được sử dụng là Windows Mobile 2002; tiếp theo là Windows Mobile 2003 với khả năng hỗ trợ multimedia cao hơn; Windows Mobile 2003 Second Edition là phiên bản hệ điều hành gần như mới nhất với khả năng hỗ trợ xoay ngang màn hình rất tiện lợi cho việc duyệt web trên Pocket PC. Hệ điều hành mới nhất là Windows Mobile 2005 – đang được cộng đồng Pocket PC mong đợi! Windows Mobile giống như Windows trên máy vi tính là hệ điều hành đa nhiệm nghĩa là: bạn có thể vừa mở cửa sổ của trình nghe nhạc vừa xem duyệt web vừa sử dụng từ điển. 2.1.2 Một25B vài khái niệm về phần cứng Pocket PC : 2.1.2.1 Màn59B hình xúc cảm : -8- Hình 2.1 Pocket PC. Màn hình xúc cảm (touch screen) là một màn hình tinh thể lỏng (LCD) được bao phủ bởi một touch panel có điện trở. LCD hướng thẳng đứng với độ phân giải là 240×320-pixel cho phép người dùng nhìn thấy các thành phần giao diện một cách rõ ràng. Độ dẫn điểm (dot pitch) dành cho Pocket PC là.22 tới.24 tùy thuộc OEM. Chạm nhẹ lên màn hình xúc cảm bằng một cây bút (stylus) hoặc ngón tay sẽ gửi cùng một loại thông điệp giống như click chuột trái lên máy desktop mặc dù việc hỗ trợ con trỏ bị giới hạn đến đồng hồ cát quay vòng cho tín hiệu chờ đợi. Người dùng cũng có thể chọn và drag các item. Để cảm thấy được những thay đổi nhanh chóng trong việc nhập liệu màn hình xúc cảm có tốc độ refresh (refresh rate) nhỏ nhất là 100 mẫu/giây (samples per second). Pocket PC cũng hỗ trợ độ sâu màu (color depth) lên đến 16 bit/pixel (bits per pixel). 2.1.2.2 Bút60B và bàn phím : Pocket PC không có bàn phím vật lí tiêu chuẩn. Việc nhập liệu văn bản được hoàn thành bằng cách sử dụng bảng nhập liệu (input panel) và bút (stylus). Nói chung bảng nhập liệu là một cửa sổ tiêu chuẩn trên màn hình xúc cảm mà hiển thị một phương thức nhập liệu cho phép người dùng nhập dữ liệu bằng nhiều cách. Phần mềm Pocket PC có phương thức nhập liệu bàn phím QWERTY được đơn giản hóa và -9- phương pháp nhập liệu nhận biết chữ viết tay. Stylus là một con trỏ dành cho cho việc truy xuất màn hình xúc cảm và các phương thức nhập liệu. Stylus này có một điểm nhỏ hơn ngón tay người dùng nhưng không làm làm xước màn hình xúc cảm. OEM hoặc người dùng có thể thêm vào các phương thức nhập liệu. Chẳng hạn một đại lí phần mềm độc lập (ISV) có thể tạo ra một phương thức nhập liệu để chạm nằm trong mã Morse. Người dùng có thể mua phương thức nhập liệu mã Morse và cài đặt nó ở nhà. 2.1.2.3 In61B ấn : In ấn hiện nay không được hỗ trên Pocket PC. 2.1.2.4 Nguồn62B điện: Bởi vì Pocket PC di chuyển được nên tuổi thọ pin rất quan trọng. Pocket PC có thể hoạt động nhiều giờ trên nguồn pin tiêu chuẩn của nó và nó có thể có pin dự phòng để tránh mất dữ liệu nếu pin chính hết năng lượng. 2.1.2.5 CPU:63B Pocket PC sử dụng họ vi xử lí ARM. Bộ xử lí ARM cung cấp sự kết hợp xuất sắc giữa độ thực thi cao và tiêu hao năng lượng ít. 2.1.2.6 Bộ64B nhớ: Tất cả các thiết bị Pocket PC có ít nhất 24 megabytes (MB) ROM và 16 MB RAM. Bản nâng cấp được đưa ra bởi một số OEM dành cho các thiết bị Pocket PC của họ được làm cho thích ứng để ăn khớp với 16 MB flash RAM sẵn có trên các thiết bị được nâng cấp đó. Bởi vì bảo quản bộ nhớ trên Pocket PC rất quan trọng nên nhiều thành phần hệ điều hành Pocket PC được nén trong ROM. Khi người dùng cần thành phần nào hệ -10- điều hành giải nén thành phần đó và chuyển nó tới RAM. Vì cần có thời gian cho giải nén và chuyển nên các file nén thực thi chậm. 2.1.2.7 Cổng65B nối tiếp cài đặt sẵn: Pocket PC có thể kết nối đến một máy desktop bằng cách sử dụng cáp nối tiếp hoặc bệ nối tùy chọn (optional docking cradle) thường là có sẵn từ nhiều nhà sản xuất Pocket PC được kết nối đến máy desktop. Một số thiết bị Pocket PC hỗ trợ giao tiếp dữ liệu thông qua một modem kết nối đến cradle. 2.1.2.8 Cổng6B giao tiếp hồng ngoại: Pocket PC có cổng nối tiếp thích hợp với kĩ thuật Infrared Data Association (IrDA). Các thiết bị Pocket PC có thể giao tiếp với các thiết bị Pocket PC khác các thiết bị nền Windows CE khác các thiết bị vi tính cầm tay nền Palm OS hoặc máy desktop. 2.2. Pocket1BU PC Emulator (2003) : 2.2.1 Định26B nghĩa Emulator: Pocket PC SDK có một môi trường giả lập mới. Môi trường này cung cấp một máy ảo chạy phần mềm Pocket PC được biên dịch cho bộ xử lí x86. Máy ảo này sao y phần cứng được biết như là CEPC là một cấu hình phần cứng chạy Windows CE trên một máy tính desktop Intel x86. 2.2.2 Sử27B dụng Emulator : Ta không được dùng phím Windows + L để đóng hệ thống khi đang sử dụng emulator. Đóng máy tính của bạn trong khi trình giả lập đang chạy có thể làm cho emulator không sử dụng được nữa khi bạn mở computer. 2.2.3 Các28B yêu cầu cho Emulator: -11- Emulator có những yêu cầu về phần cứng và phầm mềm như sau:  Microsoft Windows 2000 Professional hay Windows 2000 Server có cài đặt Service Pack 2 hoặc Microsoft Windows XP Home Edition hay Windows XP Professional.  Intel Pentium II hoặc bộ xử lí sau này chạy với tốc độ 400 MHz hoặc nhanh hơn.  196 MB RAM.  Có card mạng và kết nối hoặc là Microsoft Loopback Adapter. 2.2.4 Định29B cấu hình Emulator: Trước khi cấu hình Emulator đảm bảo rằng chúng ta đã cài đặt thành công Microsoft eMbedded Visual C++® và trình giả lập Emulator. Cách thức cài2TU đặtU2T như thế nào sang chương 3 chúng ta sẽ tìm hiểu. Phần này mô tả cách định cấu hình cho emulator trước khi sử dụng lần đầu. 2.2.4.9 Định67B cấu hình Platform Manager: Chủ đề này mô tả cách định cấu hình Platform Manager bằng cách sử dụng Microsoft eMbedded Visual C++®. Làm theo các bước sau:  Khởi động eMbedded Visual C++.  Trong eMbedded Visual C++ trên menu Tools click Configure Platform Manager. Hình 2.2 Platform Manager. -12-  Mở các kiểu thiết bị ra sau đó click Pocket PC 2003. Trong hộp thoại Windows CE Platform Manager Configuration click Pocket PC 2003 Emulator. Tùy theo các công cụ Windows CE khác được cài đặt trên máy tính có thể có những thiết bị và platform khác được liệt kê trong hộp thoại.  Click Properties. Cả transport và Startup Server đều có những tùy chọn cấu hình có thể điều chỉnh được. Click vào nút Configure dành cho TCP/IP transport để hiển thị các thiết lập mạng; tuy nhiên đề nghị là cấu hình tiêu chuẩn được giữ nguyên không đổi.  Click nút Configure dành cho the Emulator Startup Server để mở hộp thoại Emulation Configuration Settings. Hình 2.3 Màn hình Emulation Configuration Settings. Hộp thoại này cho phép những thay đổi sau:  Thay đổi phím chủ (host).  Chọn hỗ trợ mạng sẵn có (available).  Ánh xạ một cổng được giả lập đến một cổng thực trên trạm công tác phát triển. 2.2.4.10 Định68B cấu hình Pocket PC Connection Manager: Thiết bị Pocket PC giả lập sẽ yêu cầu những điều chỉnh đến các thiết lập mạng trước khi có thể truy cập Internet. Nếu mạng sử dụng proxy server để truy cập Internet thì thông tin proxy cũng phải được định cấu hình. Để định cấu hình thông tin proxy cho emulator: -13- Định cấu hình emulator với hỗ trợ mạng và khởi động emulator.  Trong cửa sổ emulator Pocket PC trên menu Start click Settings.  Click tab Connections.  Click biểu tượng Connections.  Click tab Advanced.  Click nút Network Card.  Đặt thiết lập My network card connects to thành Work.  Click OK ở góc trên bên phải.  Click tab Tasks.  Phía dưới tiêu đề My Work Network click vào link Edit my proxy server.  Chọn check box This network connects to the Internet box. Nếu mạng sử dụng proxy server:  Chọn check box This network uses a proxy server to connect to the Internet.  Gõ vào thông tin proxy server.  Click OK ở góc trên bên phải trên.  Click OK ở góc trên bên phải một lần nữa Triển khai ứng dụng eMbedded Visual C++ cho Emulator: Chủ đề này mô tả cách triển khai một ứng dụng nền eMbedded Visual C++ đến emulator. Làm theo các bước sau:  Bảo đảm emulator được định cấu hình đúng trước khi sử dụng nó lần đầu tiên.  Bảo đảm đã có thanh công cụ WCE Configuration. Hình 2.4 Màn hình eVC4.0. -14-  Bảo đảm rằng cả Win32 (WCE emulator) Release lẫn Win32 (WCE emulator) Debug được chọn trong list box Active Configuration xổ xuống và Pocket PC Emulator được chọn trong list box Default Device.  Ứng dụng sẽ được tải xuống đến emulator khi bất kì chọn lựa nào sau đây được thực hiện: Rebuild All Go (F5) hoặc Execute (CTRL+F5). Go và Execute cũng khởi động ứng dụng. Cũng có thể thay đổi cách hoạt động tải xuống mặc định của eMbedded Visual C++ bằng cách click Tools click Options tiếp đó click tab Download trong hộp thoại Options. Lưu ý: eMbedded Visual Basic không còn được hỗ trợ nữa. 2.2.4.11 Di69B chuyển các file đến và đi khỏi Emulator: Bạn có thể di chuyển các tập tin đến hoặc đi khỏi trình giả lập bằng cách sử dụng bất kì phương pháp nào sau đây:  Sử dụng tính năng Explore của ActiveSync.  Sử dụng công cụ Remote File Viewer mà sẵn có trong eMbedded Visual C++ 4.0. Chức năng Export di chuyển một file từ hệ thống file của trạm công tác phát triển đến hệ thống file của thiết bị Pocket PC thực hoặc giả lập. Chức năng Import di chuyển các file từ thiết bị Pocket PC thực hoặc giả lập sang hệ thống file của trạm công tác phát triển.  Chia sẻ (dùng chung) các file trong hệ thống file của trạm công tác phát triển và truy xuất những file đó bằng cách sử dụng File Manager trong image Pocket PC giả lập. -15- 2.2.5 Tắt30B Emulator: Hình 2.5 Màn hình tắt Emulator. Bạn có thể tắt emulator bằng cách sử dụng bất kì phương pháp nào sau đây: Click Close trong thanh tiêu đề của cửa sổ emulator click Shut Down trên menu Emulator hoặc xài phím tắt để làm hộp thoại xuất hiện Shut Down. Hộp thoại Shut Down được minh họa như hình trên. Danh sách xổ xuống trong hộp thoại Shut Down cung cấp 2 tùy chọn: Turn off Emulator: Tắt image giả lập mà không lưu lại trạng thái hiện tại. Save Emulator State: Lưu trạng thái hiện tại của emulator để nó có sẽ trả về điểm này trong lần khởi động emulator kế tiếp. Việc chọn không lưu tình trạng emulator cung cấp một image sạch trong emulator khi khởi động lần tới. Image sạch này bao gồm cả hệ thống file và registry mới. Lưu trạng thái emulator cung cấp cơ hội tiếp tục làm việc từ điểm dừng làm việc trước đó. Trạng thái emulator được lưu vào file nhị phân với phần mở rộng là.vsv; file này được lưu trong thư mục C:\Documents and Settings\logonname\Application Data. Chẳng hạn với logon name của Michael tên đường dẫn sẽ là C:\Documents and Settings\Michael\Application Data. File.vsv này sẽ có kích thước xấp xỉ 14 MB. Xóa file này sẽ làm cho emulator mất đi trạng thái lưu lại trước đó của nó. 2.2.6 Những31B hạn chế của Emulator: Mặc dù emulator mới là một bước tiến ấn tượng (dramatic) về độ trung thực và sự thuận tiện cho việc phát triển mỗi emulator có những hạn chế của nó khi so sánh với -16- thiết bị mà nó giả lập. Emulator được có trong Pocket PC SDK vận hành mã Pocket PC thực mà được biên dịch để nhắm tới CPU x86. Trong đa số các kịch bản (scenarios) phát triển ứng dụng thiết lập này là đủ. Tuy nhiên vẫn có một số hạn chế đối với loại giả lập này: Để sử dụng emulator các ứng dụng phải được biên dịch để chạy trên CPU x86. Ứng dụng này sẽ khó tránh khỏi những khác biệt tiềm tàng trong các trình biên dịch x86 runtime và các file hỗ trợ khi được so sánh với các thiết bị dựa trên ARM. Bởi vì những khác biệt trong cấu trúc CPU (x86 CISC so với ARM RISC) và những thiết lập chỉ thị không thể dùng emulator để trình diễn việc thực thi tuyệt đối tối tỉ mỉ và sự tối ưu memory footprint. Tuy nhiên đối với hầu hết trình ứng dụng mức phân tích này không thành vấn đề. Màn hình xúc cảm của thiết bị được thay thế bằng con chuột. Mặc dù con chuột về mặt chức năng tương đương với màn hình xúc cảm nhưng những nhà phát triển ứng dụng phải xem xét thêm kinh nghiệm của người dùng chạy ứng dụng trên thiết bị mà cần có bút (stylus). Việc ghi âm không được hỗ trợ trong emulator bất chấp các khả năng ghi âm của máy tính phát triển chạy emulator. 2.3. Sơ12BU lược về mạng : Mục đích của việc xây dựng hệ thống mạng (dù nhỏ hay lớn) là để trao đổi thông tin chia sẽ thông tin chia sẽ thiết bị với nhau .. Do đó điều chúng ta cần quan tâm trong phần này là tìm hiểu xem thông tin được truyền như thế nào và các máy tính trong mạng (host) gửi và nhận thông tin ra sao. Muốn thế ta hãy tìm hiểu một số khái niệm sau đây. 2.3.1 Nguồn32B đích và các gói dữ liệu : Để cho các máy tính gửi thông tin xuyên qua một mạng tất cả các hoạt động truyền tin trên một mạng đều xuất phát từ một nguồn sau đó di chuyển đến một -17- đích. Thông tin được di chuyển trên một mạng được tham chiếu đến như là dữ liệu gói hay gói dữ liệu. Một gói dữ liệu là một đơn vị thông tin được nhóm lại theo luận lý và di chuyển giữa các hệ thống máy tính. Bao gồm trong đó là thông tin về nguồn tin cùng với các phần tử cần thiết khác để thực hiện một hoạt động truyền tin cậy với thiết bị đích. Địa chỉ nguồn trong một gói chỉ ra danh định của máy tính đã gửi gói này. Địa chỉ đích chỉ danh định của máy tính sau cùng tiếp nhận gói. 2.3.2 Môi3B trường truyền dẫn : Môi trường truyền dẫn trong mạng là một miền vật chất mà qua đó các gói dữ liệu di chuyển. Nó có thể là bất kỳ loại nào sau đây : Các dây điện thoại.  Cáp UTP loại 5 (được dùng cho 10 BASE – T).  Các cáp đồng trục (được dùng cho truyền hình).  Sợi quang. (sợi thủy tinh mảnh truyền ánh sáng). Có hai loại mội trường không rõ ràng cho lắm nhưng dẫu sao nó cũng tham gia vào hoạt động thông tin trên mạng. Trước hết là không khí (hầu hết là oxy nitơ và hơi nước) nó mang sóng radio sóng vi ba và ánh sáng. Hoạt động thông tin không dùng dây dẫn hay cáp được gọi là thông tin không dây hay thông tin không gian tự do (wireless hay free – space communication). Đó là khả năng dùng sóng điện từ EM (electromagnetic). Các sóng điện từ lan truyền trong chân không với tốc độ ánh sáng gồm có sóng năng lượng sóng radio sóng vi ba ánh sáng hồng ngoại ánh sáng nhìn thấy tia cực tím tia X tia gamma. Các sóng điện từ lan truyền trong không khí nhưng chúng cũng lan truyền qua khoảng chân không 2.3.3 Giao34B thức : Để các gói dữ liệu có thể di chuyển từ nguồn đến đích trên mạng điều quan trọng là tất cả các thiết bị trên mạng phải nói cùng một ngôn ngữ hay giao thức. Một giao thức là một tập các quy định giúp thực hiện hoạt động thông tin trên mạng. -18- Sự phát triễn của các chuẩn lập lập mạng ISO : Nhằm giải quyết vấn đề không tương thích của các mạng và không thể trao đổi thông tin với nhau giữa các mạng tổ chức tiêu chuẩn hóa quốc tế ISO đã nghiên cứu lược đồ mạng như DECNET SNA và TCP/IP để tìm ra một bộ luật. Kết quả của nghiên cứu này ISO đã tạo ra được một mô hình mạng giúp cho các nhà chế tạo có thể tạo ra các mạng riêng của mình nhưng vẫn đảm bảo tương thích và liên kết hoạt động với các mạng khác. Quá trình này chia hoạt động thông tin phức tạp thành các tác vụ rời rạc nhỏ hơn. Mô hình tham chiếu OSI được công bố vào năm 1984 nó mô tả lược đồ phân lớp mà tổ chức này đã xây dựng được. Mô hình cung cấp cho các nhà chế tạo một tập các tiêu chuẩn đảm bảo tương thích và liên kết hoạt động tốt hơn giữa các kỹ thuật mạng khác nhau được tạo ra bởi nhiều công ty trên thế giới. 2.3.4 Mô35B hình tham chiếu OSI : Mô hình tham chiếu OSI là mô hình chủ yếu cho các hoạt động thông tin trên mạng. Mặc dù đã có các mô hình khác nhưng hầu hết các nhà chế tạo ngày nay đều tạo ra các sản phẩm của họ trên cơ sở tham chiếu đến mô hình OSI. Mô hình tham chiếu OSI cho phép bạn nhận ra được các chức năng mạng diễn ra tại mỗi lớp. Nó là một khuôn mẫu giúp bạn hiểu thông tin di chuyển xuyên qua một mạng như thế nào. Nó được chia thành 7 lớp : * Lớp 7: Lớp ứng dụng (the application layer) Lớp ứng dụng là lớp gần gũi với người dùng hơn hết nó cung cấp các dịch vụ mạng cho các ứng dụng của người dùng. Nó khác với các lớp khác ở chỗ không cung cấp các dịch vụ cho bất kỳ lớp nào thay vì vậy nó chỉ cung cấp các dịch vụ cho các ứng dụng nằm bên ngoài mô hình OSI. Các chương trình ứng dụng như chương trình xử lý bảng tính các chương trình xử lý văn bản các chương trình đầu cuối. Lớp ứng dụng thiết lập tính sẵn sàng cho các đối tác thông tin đồng bộ hóa và -19- thiết lập tính nhất quán trên các thủ tục khắc phục lỗi và kiểm soát tính toàn vẹn dữ liệu. Nếu bạn muốn ghi nhớ lớp 7 chỉ bằng vài từ ngắn gọn thì hãy nghĩ đến các trình duyệt web. * Lớp 6: Lớp trình bày (the presentation layer) Lớp trình bày đảm bảo thông tin mà lớp ứng dụng của một hệ t... TCP/IP cấp phát một số lượng không gian bộ đệm có hạn cho hàng đợi dữ liệu đi và vào và thường thì bộ đệm này đầy khá nhanh. Ví dụ nếu chúng ta yêu cầu một file 10 MB từ một trang web hàng đợi dữ liệu vào của ta sẽ khóa cho đến khi ta đọc được dữ liệu từ hàng đợi này (dùng hàm receive()). Việc truyền dữ liệu cũng tương tự như thế cho nên chúng ta cần đảm bảo rằng : tất cả dữ liệu ra của chúng ta đã được gửi. Ví dụ sau thể hiện việc gửi dữ liệu bộ đệm trên TCP : // Send a request to the server char cBuffer[1024] = ""; int nBytesSent = 0; int nBytesIndex = 0; // Set up the buffer to send sprintf(cBuffer "GET / HTTP/1.0\r\n\r\n"); int nBytesLeft = strlen(cBuffer); // Send the entire buffer while(nBytesLeft > 0) { nBytesSent = send(s &cBuffer[nBytesIndex] nBytesLeft 0); if(nBytesSent == SOCKET_ERROR) break; -51- // See how many bytes are left. If we still need to send loop nBytesLeft -= nBytesSent; nBytesIndex += nBytesSent; } 3.3.1.1.6 Ví98B dụ: Ví dụ sau trình bày cách dùng socket TCP để tạo một client cơ bản để kết nối với một trang web gửi yêu cầu và nhận trang web HTML mặc định. Khi thực hiện thành công nó sẽ nội dung trên Message Box. Bộ đệm thực sự được trả về từ yêu cầu này được trình bày trong hình sau : Hình 3.43 // Initialize Winsock WSADATA wsaData; memset(&wsaData 0 sizeof(WSADATA)); if(WSAStartup(MAKEWORD(11) &wsaData) != 0) return FALSE; // Create a connection-oriented socket SOCKET s = socket(AF_INET SOCK_STREAM IPPROTO_TCP); // Check to see if we have a valid socket if(s == INVALID_SOCKET) { -52- int iSocketError = WSAGetLastError(); return FALSE; } // Get the host information HOSTENT *hostServer = gethostbyname("www.microsoft.com"); if(hostServer == NULL) { int iSocketError = WSAGetLastError(); return FALSE; } // Set up the target device address structure SOCKADDR_IN sinServer; memset(&sinServer 0 sizeof(SOCKADDR_IN)); sinServer.sin_family = AF_INET; sinServer.sin_port = htons(80); sinServer.sin_addr = *((IN_ADDR *)hostServer>h_addr_list[0]); // Connect if(connect(s (SOCKADDR *)&sinServer sizeof(sinServer)) == SOCKET_ERROR) { int iSocketError = WSAGetLastError(); return FALSE; } // Send a request to the server char cBuffer[1024] = ""; int nBytesSent = 0; int nBytesIndex = 0; // Set up the buffer to send -53- sprintf(cBuffer "GET / HTTP/1.0\r\n\r\n"); int nBytesLeft = strlen(cBuffer); // Send the entire buffer while(nBytesLeft > 0) { nBytesSent = send(s &cBuffer[nBytesIndex] nBytesLeft 0); if(nBytesSent == SOCKET_ERROR) break; // See how many bytes are left. If we still need to send loop nBytesLeft -= nBytesSent; nBytesIndex += nBytesSent; } // Get the response TCHAR tchResponseBuffer[1024] = TEXT("\0"); char cResponseBuffer[1024] = ""; BOOL fBreak = FALSE; int nBytesReceived = 0; while(!fBreak) { nBytesReceived = recv(s &cResponseBuffer[0] 1024 0); if(nBytesReceived == SOCKET_ERROR) break; // Convert the data from ANSI to Unicode mbstowcs(tchResponseBuffer cResponseBuffer nBytesReceived); // Show the MessageBox MessageBox(NULL tchResponseBuffer TEXT("Web Output") MB_OK); // Check to see if this is the end of the HTTP response by // looking for \r\n\r\n if(_tcsstr(tchResponseBuffer TEXT("\r\n\r\n"))) -54- fBreak = TRUE; // Clear the buffers memset(tchResponseBuffer 0 1024); memset(cResponseBuffer 0 1024); } closesocket(s); WSACleanup(); 3.3.1.2 Server:76B 3.3.1.2.1 Nhận9B một kết nối vào (Server) : Sự khác nhau cơ bản của việc truyền dữ liệu giữa luồng kết nối Server và Client là cách kết nối được thiết lập (lient thì tạo kết nối còn Server thì lắng nghe kết nối). Mặt khác, cả hai đều sử dùng phương thức send() và recv() để trao đổi dữ liệu giữa hai máy. Chúng ta đã tìm hiểu ở phía Client giờ đây ta bắt đầu tìm hiểu cách tạo một ứng dụng theo yêu cầu của những dịch vụ kết nối vào (hình thành do gọi hàm connect()). Điều đầu tiên mà chúng ta cần làm là tạo một socket; giống như ta đã làm ở phía Client bằng cách gọi hàm socket(). Sau khi đã tạo socket rồi thay vì kết nối đến một Server ta để socket mới này ở trạng thái lắng nghe kết nối vào. Để làm được việc đó chúng ta cần kết buộc (bind) socket mới được tạo này với một địa chỉ cục bộ. Để tạo kết buộc này ta dùng hàm bind(). int bind(SOCKET s const struct sockaddr *addr int namelen); Tham số đầu tiên s là một handle của socket được tạo bởi hàm socket() và ta sẽ dùng socket này để chở kết nối. Tham số addr là một con trỏ trỏ đến address buffer được xác định bởi giao thức mà ta muốn sử dụng. Nếu ta muốn dùng giao thức TCP/IP chuẩn thì chúng ta sẽ dùng bộ đệm SOCKADDR_IN. Nếu dùng giao thức hồng ngoại thì sử dùng SOCKADDR_IRDA. Tham số cuối cùng namelen chỉ kích thước của cấu -55- trúc địa chỉ (address structure) mà tham số addr đã dùng. Nếu không có lỗi hàm bind() sẽ trả về 0 ngược lại một SOCKET_ERROR sẽ xuất hiện. Ví dụ sau sẽ kết buộc kết nối TCP trên cổng 80 đến một socket cho tất cả địa chỉ IP trên thiết bị. SOCKADDR_IN sListener; memset(&sListener 0 sizeof(SOCKADDR_IN)); // Set up the port to bind on sListener.sin_family = AF_INET; sListener.sin_port = htons(80); sListener.sin_addr.s_addr = htonl(INADDR_ANY); // Create a TCP socket SOCKET s = socket(AF_INET SOCK_STREAM IPPROTO_TCP); if(s == INVALID_SOCKET) return FALSE; // Bind to the socket if(bind(s (SOCKADDR *)&sListener sizeof(sListener)) == SOCKET_ERROR) { int iSocketError = WSAGetLastError(); return FALSE; } Chú ý rằng: Ta đã dùng địa chỉ IP INADDR_ANY thay vì địa chỉ IP của Adapter. Dùng INADDR_ANY làm cho chúng ta có thể kết buộc socket vào tất cả những địa chỉ IP có sẵn trên thiết bị của chúng ta do đó những kết nối vào trên bất kỳ giao diện nào cũng được chấp nhận bởi socket của chúng ta. Khi socket đã được kết buộc vào địa chỉ (hoặc nhiều địa chỉ) chúng ta cần đặt socket này ở chế độ lắng nghe. Điều này làm cho socket có thể chờ những kết nối vào -56- int listen(SOCKET s int backlog); Tham số s chỉ socket đã kết buộc. Tham số backlog xác định kích thước của hàng đợi cho kết nối vào thường được thiết lập là SOMAXCONN (trên Pocket PC hiện nay chỉ giới hạn cho hai kết nối). Hàng đợi backlog được dùng khi cùng lúc có nhiều kết nối vào. Khi hàng đợi đầy tất cả những yêu cầu khác sẽ bị từ chối cho đến khi một yêu cầu kết nối được lấy ra khỏi hàng đợi bởi hàm accept(). Nếu có lỗi hàm listen() sẽ trả về giá trị SOCKET_ERROR ngược lại là giá trị 0 Cuối cùng để nhận socket của kết nối vào chúng ta cần gọi hàm accept() được xác định như sau. SOCKET accept(SOCKET s struct sockaddr *addr int * addrlen); Tham số s chỉ socket mà chúng ta đã đặt ở chế độ lắng nghe ở trên. Tham số addr chỉ bộ đệm dùng để nhận hoặc là một cấu trúc SOCKADDR_IN hoặc là SOCKADDR_IRDA tùy thuộc vào giao thức mà socket đã dùng chứa những thông tin về kết nối vào. Tham số cuối cùng addrlen chỉ kích thước của cấu trúc addr. Chú ý rằng: phương thức accept() không trả về giá trị ngay lập tức. Điều này là do accept() là hàm khóa nghĩa là nó sẽ không trả về giá trị cho đến khi có kết nối từ một client hoặc socket lắng nghe bị hủy (ta cũng có thể thiết lập một tùy chọn socket để đặt nó ở chế độ không khóa). Khi hàm accept() trả về thì giá trị của nó hoặc là một socket handle mới cho client kết nối vào hoặc là một lỗi SOCKET_ERROR. Tất cả những thông tin về client kết nối vào sẽ được thể hiện ở socket handle mới này trong khi socket ban đầu tiếp tục lắng nghe nhiều kết nối khác. 3.3.1.2.2 Ví10B dụ: Ví dụ sau thể hiện việc Server lắng nghe kết nối vào của một Client yêu cầu một trang Web dùng giao thức HTTP và trả về cho Client một hồi đáp. // Initialize Winsock WSADATA wsaData; -57- memset(&wsaData 0 sizeof(WSADATA)); if(WSAStartup(MAKEWORD(11) &wsaData) != 0) return FALSE; // Create a connection-oriented socket SOCKET s = socket(AF_INET SOCK_STREAM IPPROTO_TCP); // Check to see if we have a valid socket if(s == INVALID_SOCKET) { int iSocketError = WSAGetLastError(); return FALSE; } SOCKADDR_IN sListener; memset(&sListener 0 sizeof(SOCKADDR_IN)); // Setup the port to bind on sListener.sin_family = AF_INET; sListener.sin_port = htons(80); sListener.sin_addr.s_addr = htonl(INADDR_ANY); // Bind to the socket if(bind(s (SOCKADDR *)&sListener sizeof(sListener)) == SOCKET_ERROR) { int iSocketError = WSAGetLastError(); return FALSE; } // Listen for incoming connections if(listen(s SOMAXCONN) == SOCKET_ERROR) { int iSocketError = WSAGetLastError(); return FALSE; } -58- // Wait for a connection SOCKADDR_IN sIncomingAddr; memset(&sIncomingAddr 0 sizeof(SOCKADDR_IN)); int iAddrLen = sizeof(SOCKADDR_IN); SOCKET sIncomingSocket = accept(s (SOCKADDR *) &sIncomingAddr &iAddrLen); if(sIncomingSocket == SOCKET_ERROR) { int iSocketError = WSAGetLastError(); return FALSE; } // We have an incoming socket request char cResponseBuffer[1024] = ""; int nBytesReceived = 0; // Get a basic request. In reality we would want to check // the HTTP request to see if it's valid but let's just // send a simple response. nBytesReceived = recv(sIncomingSocket &cResponseBuffer[0] 1024 0); if(nBytesReceived == SOCKET_ERROR) { int iSocketError = WSAGetLastError(); return FALSE; } // Send out a response char cBuffer[1024] = ""; int nBytesSent = 0; int nBytesIndex = 0; // Setup the buffer to send -59- sprintf(cBuffer &"HTTP/1.0 200 OK\r\n\r\nTest Response\r\n\r\n"); int nBytesLeft = strlen(cBuffer); // Send the entire buffer while(nBytesLeft > 0) { nBytesSent = send(sIncomingSocket &cBuffer[nBytesIndex] nBytesLeft 0); if(nBytesSent == SOCKET_ERROR) break; // See how many bytes are left. If we still need to send loop nBytesLeft -= nBytesSent; nBytesIndex += nBytesSent; } // Close the sockets closesocket(sIncomingSocket); closesocket(s); WSACleanup(); 3.3.1.3 Đóng7B Socket : Một khi đã hoàn thành việc sử dụng socket dù ở trên Server hay Client chúng ta phải giải phóng tài nguyên thiết bị đã được liên kết với socket đó Trước khi ta thực sự đóng một socket ta nên gọi hàm shutdown(). Chúng ta có thể trực tiếp hủy một socket bằng cách đóng nó nhưng tốt hơn ta nên gọi hàm shutdown() trước tiên bởi vì điều này đảm bảo rằng: tất cả dữ liệu trong hàng đợi vận chuyển TCP đã được gửi hoặc nhận hết trước khi socket bị đóng: int shutdown(SOCKET s int how); Tham số s là handle của socket mà ta muốn đóng. Tham số how xác định cách -60- thức những hàm socket xảy ra sau được xử lý trên socket này. Có ba tùy chọn : SD_RECEIVE SD_SEND SE_BOTH. Chọn SD_RECEIVE sẽ ngăn chặn việc gọi hàm recv() và SD_SEND sẽ ngăn chặn việc gọi hàm send(). Rõ ràng SD_BOTH sẽ dừng việc gửi và nhận dữ liệu trên socket (tuy nhiên tất cả dữ liệu đã nằm trong hàng đợi sẽ được xử lý). Nếu không có lỗi hàm shutdown() sẽ trả về 0. Một khi socket đã bị shutdown() chúng ta không thể dùng nó được nữa trừ khi chúng ta đóng nó bằng hàm closesocket(). int closesocket(SOCKET s); với s làm handle của socket mà ta muốn đóng. 3.3.2 Sử50B dụng MFC: 3.3.2.1 Giới78B thiệu về lớp CSocket: Hình 3.44 ơ đồ kế thừa của lớp CSocket. Lớp CSocket kết thừa từ lớp cha của nó là CAsyncSocket do đó nó thừa hưởng những thành phần Windows sockets API của lớp CasyncSocket.Xem chi tiết trong MSDN. Những phần tiếp theo chúng ta sẽ khảo sát những thành phần cơ bản của lớp CSocket hỗ trợ cho việc lập trình mạng. 3.3.2.2 Client:79B Để có thể sử dụng được thư viện CSocket cần phải làm hai công việc một là thêm dòng #include vào đầu tập tin có sử dụng lớp Csocket. Công việc thứ hai cần làm là để có thể sử dụng thư viện CSocket là phải gọi -61- hàm AfxSocketInit(NULL) trước khi sử dụng các hàm của lớp Csocket mục đích là để khởi tạo thư viện. Nếu không mọi hàm sử dụng thư viện tuy được biên dịch thành công nhưng vẫn báo lỗi khi thi hành chương trình. Để kết nối đến một cổng chở kết nối trước tiên ta phải khởi tạo một socket với hàm như sau: BOOL Create(): Hàm tạo socket ở phia Client không có tham số. Nếu việc tạo socket thành công thì hàm sẽ trả về kết quả khác 0; nếu xảy ra lỗi thì hàm sẽ trả về kết quả là 0. Ta có thể dùng hàm int GetLastError() để lấy thông tin mã lỗi. Sau khi đã tạo một socket thành công bước tiếp theo là ta sẽ dùng socket đó để kết nối đến Server đang mở dịch vụ ta sẽ dùng hàm sau để kết nối: BOOL Connect( LPCTSTR Error! Hyperlink reference not valid. UINT Error! Hyperlink reference not valid.) lpszHostAddress: là địa chỉ của Server mà ta cần kết nối đến. Ta có thể truyền cho tham số này theo tên miền hoặc theo địa chỉ IP. Ví dụ: “ftp.microsoft.com2TU U2T ” hoặc “128.56.22.8” đều được. Mỗi máy tính đều có một địa chỉ IP mặc định là “127.0.0.1” hoặc “localhost”. Do đó nếu như chúng ta thực hành kết nối cho cả Server và Client trên cùng một máy thì ta có thể kết nối đến địa chỉ này. nHostPort: Là số cổng của dịch vụ mà server đang mở. Ví dụ cổng của dịch vụ web là 80 cổng của dịch vụ ftp là 21...... Sau đây là ví dụ cho việc tạo và kết nối đến dịch vụ cổng 1111 trên Server. CSocket skConnect; If(!skConnect.Create() || !skConnect.Connect(“localhost”1111)) { cout<<”ket noi khong thanh cong”<<endl; exit(0); } else cout<<”kết nối thành công”; -62- Sau khi đã kết nối được server ta sẽ dùng hai hàm sau đây để gửi và nhận thông điệp. Hàm gửi thông điệp: int Send(const void* Error! Hyperlink reference not valid.int Error! Hyperlink reference not valid.int Error! Hyperlink reference not valid. = 0); lpBuf: là bộ đệm dùng để chứa dữ liệu được gửi. nBuffeLen: Chiều dài của dữ liệu lpBuf dưới dạng Byte. nFlags: Mặc định là 0 ta có thể không cần truyền tham số này. Nếu không có lỗi xảy ra thì hàm này sẽ trả về giá trị tổng số kí tự được gửi(giá trị này phải nhỏ hơn giá trị của nBufLen). Nếu xảy ra lỗi thì hàm sẽ trả về giả trị SOCKET_ERROR. Chúng ta có thể tìm được mã lỗi thông qua hàm int GetLastError(). Xem thêm trong MSDN. Hàm nhận thông điệp từ socket: virtual int Receive( void*Error! Hyperlink reference not valid.int Error! Hyperlink reference not valid.int Error! Hyperlink reference not valid. = 0); Tất cả những tham số này đều có ý nghĩa tương tự như các tham số của hàm Send() ở trên.Nếu không có lỗi xảy ra thì giá trị trả về của hàm này là tổng số byte nhận được. Nếu đã đóng kết nối socket thì kết quả trả về là 0. Nếu xảy ra lỗi thì kết quả trả về sẽ là một SOCKET_ERROR được xác định trong hàm int GetLastError(). Tham khảo mã lỗi trong MSDN. Ví dụ sau sẽ trình bày minh họa cho việc gửi và nhận dữ liệu: Char msg[1000]; Int msg_len; While(1) { cout<<”Nhap thong diep: “; gets(msg); -63- msg_len = strlen(msg); //Gửi thông điệp đến server skConnect.Send(&msg_len sizeof(msg_len)); //Gửi chiều dài thông điệp. skConnect.Send(msgmsg_len);//Gửi nội dung thông điệp. //Nhận thông điệp đến server skConnect.Receive(&msg_len sizeof(msg_len)); //nhận chiều dài thông điệp. skConnect.Receive(msgmsg_len);//Nhận nội dung thông điệp. } Cuối cùng sau khi hoàn tất truyền dữ liệu đóng kết nối với câu lệnh như sau: virtual void Close(); Sau đây là toàn bộ nội dung đã thực hiện cho client. CSocket skConnect; If(!skConnect.Create() || !skConnect.Connect(“localhost”1111)) { cout<<”ket noi khong thanh cong”<<endl; exit(0); } else cout<<”kết nối thành công”; Char msg[1000]; Int msg_len; While(1) { cout<<”Nhap thong diep: “; gets(msg); msg_len = strlen(msg); -64- //Gửi thông điệp đến server skConnect.Send(&msg_len sizeof(msg_len)); //Gửi chiều dài thông điệp. skConnect.Send(msgmsg_len);//Gửi nội dung thông điệp. //Nhận thông điệp đến server skConnect.Receive(&msg_len sizeof(msg_len)); //nhận chiều dài thông điệp. skConnect.Receive(msgmsg_len);//Nhận nội dung thông điệp. skConnect[msg_len] = 0;//Kết thúc chuỗi. } skConnect.Close(); 3.3.2.3 Server:80B Cũng tương tự như các phía Client điều trước tiên chúng ta cần làm là khởi tạo một socket dùng để tạo dịch vụ. Câu lệnh khởi tạo socket phía server có hơi khác so với phía Client. Nguyên mẫu của hàm như sau: BOOL Create(UINT Error! Hyperlink reference not valid. = 0int Error! Hyperlink reference not valid. = SOCK_STREAMLPCTSTR Error! Hyperlink reference not valid. = NULL); nSocketPort: Số cổng mà ta sử dụng để mở dịch vụ. nSocketType: SOCK_STREAM(tương ứng với giao thức TCP) hoặc là SOCK_DGRAM(tương ứng với giao thức UDP). Mặc định của hàm là SOCK_STREAM. Error! Hyperlink reference not valid. :là chuỗi con trỏ chứa địa chỉ mạng của một kết nối socket. Mặc định là NULL. Giá trị khác 0 sẽ được hàm này trả về nếu không có lỗi xảy ra. Ngược lại là 0.Chúng ta có thể tham khảo mã lỗi thông qua hàm int GetLastError(); Trong CSocket chúng không cần thiết phải gọi hàm bind() bởi vì sau khi gọi hàm Create() thì tự động hàm bind() sẽ được gọi để kết buộc socket đến địa chỉ xác -65- định. Sau khi đã khởi tạo socket thành công tiếp theo ta sử dụng hàm Listen để nghe ngóng kết nối. BOOL Listen(int Error! Hyperlink reference not valid. = 5); Error! Hyperlink reference not valid.: Chiều dài tối đa có mà hàng đợi của những kết nối vào có thể chứa được. Giá trị này giới hạn trong khoảng từ 1 đến 5; mặc định là 5. Nếu không có lỗi thì hàm này sẽ trả về giá trị khác không; ngược lại sẽ cho giá trị là không và mã lỗi sẽ được xác định thông qua hàm GetLastError. Để chấp nhận một kết nối vào trước tiên cần phải khởi tạo socket bằng hàm Create sau đó một backlog (dãy) các kết nối vào sẽ được xác định bởi hàm Listen. Sau đó những kết nối này sẽ được chấp nhận bởi hàm Accept. Hàm Listen chỉ áp dụng cho những socket hỗ trợ kết nối điển hình là dạng SOCK_STREAM. Socket này được đặt ở chế độ “bị động”_ chế độ mà những kết nối vào được thừa nhận và được xếp hàng chờ đợi bởi tiến trình này. Hàm này thường được sử dụng ở Server(hoặc có thể ở bất kỳ ứng dụng nào muốn chấp nhận kết nối vào) cho phép có nhiều hơn một kết nối được yêu cầu ở cùng một thời điểm. Nếu có yêu cầu kết nối nhưng hàng đợi đã đầy(nConnectionBacklog = 5) thì client sẽ nhận một lỗi WSAECONNREFUSED. Tiếp theo ta sử dụng hàm Accept để chấp nhận kết nối. virtual BOOL Accept( CAsyncSocket& Error! Hyperlink reference not valid. SOCKADDR* Error! Hyperlink reference not valid. = NULL int* Error! Hyperlink reference not valid. = NULL ); rConnectedSocket: Tham chiếu đến socket mới được lấy tự Client. lpSockAdd : Là một con trỏ đến cấu trúc SOCKADDR socket kết nối đến. Nếu -66- lpSockAddr hoặc lpSocketAddrLen có giá trị là NULL thì sẽ không có thông tin nào về địa chỉ của socket vừa được kết nối được trả về. Mặc định là NULL. Error! Hyperlink reference not valid. : Là con trỏ trỏ đến chiều dài chương trình của của địa chỉ trong lpSockAddr dưới dạng byte. Tương tự như các phương thức ở trên giá trị trả về của hàm này là khác 0 nếu hàm chương trình thực hiện thành công ngược lại sẽ bằng 0. Mã lỗi sẽ được xác định thông qua hàm GetLastError.(xem chi tiết trong MSDN). Sau khi đã chấp nhận kết nối ta có thể dùng các hàm Send Receive để truyền và nhận thông điệp và hàm Close để đóng socket giống như đã làm ở Client. Ví dụ sau sẽ trình bày cách thức một server chấp nhận một kết nối vào: Các biến được sử dụng trong ví dụ này sẽ gồm 2 biến CSocket một để mở cổng và một để truyền dữ liệu (Trong thực tế một cổng có thể cho phép nhiều client nối vào khi đó vẫn chỉ có một CSocket để mở cổng nhưng sẽ có nhiều CSocket để truyền dữ liệu). CSocket skListen skConnect; If(!skListen.Create(1111) || !skListen.Listen() || !skListen.Accept(skConnect)) { cout<<”server socket bi loi”; exit(0); } else { //truyền thông điệp qua lại giữa client và server. char msg[1000]; int msg_len; while(1); { //Nhận thông điệp từ Client -67- skConnect.Receive(&msg_len sizeof(msg_len)); //nhận chiều dài thông điệp. skConnect.Receive(msgmsg_len);//Nhận nội dung thông điệp. skConnect[msg_len] = 0; //Kết thúc chuỗi. //Gửi thông điệp đến Client skConnect.Send(&msg_len sizeof(msg_len)); //Gửi chiều dài thông điệp. skConnect.Send(msgmsg_len);//Gửi nội dung thông điệp. } skConnect.Close(); } -68- Chương 4 Ứng3B dụng minh họa 4.1. Mô17BU tả ứng dụng minh họa: 4.1.1 Ứng51B dụng chat giữa Pocket PC với máy tính để bàn: 4.1.1.1 Mục81B đích: Ứng dụng này cho phép Pocket PC cùng lúc có thể liên lạc trao đổi thông tin với nhiều máy tính để bàn khác nhau thông qua một máy chủ. 4.1.1.2 Chức82B năng: 4.1.1.2.1 Server:10B Dùng một máy tính để bàn làm server. Server sẽ tạo một dịch vụ trên cổng 1111 cho phép các client kết nối vào. Sau khi các client kết nối thành công vào dịch vụ mà Server đang mở các client sẽ được yêu cầu đăng ký nick name khác nhau để có thể liên lạc với nhau. 4.1.1.2.2 Client:102B Client bao gồm một bên là Pocket PC còn lại là các máy tính để bàn. Sau khi server đã mở dịch vụ các client có thể kết nối vào dịch đó. Nếu kết nối thành công thì các client được phép đăng ký nick name và có thể trao đổi thông tin được với nhau. 4.1.2 Ứng52B dụng điều khiển Power Point: 4.1.2.1 Mục83B đích: Ứng dụng này cho phép chúng ta sử dụng Pocket Pc để điều khiển Power Point ở máy -69- chủ. 4.1.2.2 Chức84B năng: 4.1.2.2.1 Server:103B Dùng máy tính làm server. Trên máy tính đang làm server sẽ đồng thời đang chạy trình chiếu Power Point. Server sẽ nhận thông điệp từ Client(Pocket PC). Server chỉ nhận 6 loại thông điệp đó là: lên xuống đầu trang cuối trang số trang bất kỳ thoát. Từ những thông điệp này mà server sẽ điều khiển Power theo những yêu cầu của thông điệp đó. 4.1.2.2.2 Client:104B Sau khi server đã mở dịch vụ client(Pocket PC) sẽ kết nối đến server. Nếu kết nối thành công client sẽ gửi đến server 6 thông điệp nêu trên để server xử lý. 4.2. Chi18BU tiết các hàm liên quan đến ứng dụng: Do đặc điểm của chương trình chat giữa Pocket PC và các máy tính để bàn có kết nối mạng là Pocket PC có khả năng cùng lúc có thể liên lạc được với nhiều máy tính để bàn do đó trong ứng dụng này đòi hỏi phải sử dụng kỹ thuật lập trình song song. Trong MFC có hỗ trợ cơ chế đa tuyến ở đây chúng ta chỉ đề cập đến một vài thành phần của cơ chế đa tuyến để hỗ trợ cho ứng dụng minh họa. Đa tuyến: Cơ chế lập trình đa tiểu trình(MultiThread) cho phép ứng dụng có thể có nhiều tác vụ được xử lý song song. Điều này giúp cho chương trình tăng được hiệu quả tính toán và linh hoạt hơn trong xử lý. Một tiểu trình cơ bản phải có hàm xử lý của tiểu trình (ThreadProc) hàm này sẽ chứa nội dung xử lý của tiểu trình. Có thể dung một số hàm khác nhau để tạo tiểu trình chẳng hạn: CreateThread _beginthreadAfxBeginThread....Ở đây ta sẽ khảo sát hàm CreateThread. HANDLE CreateThread ( -70- SEC_ATTRS SecurityAttributes ULONG StackSize SEC_THREAD_START StartFunction PVOID ThreadParameter ULONG CreationFlags PULONG ThreadId ); Quan trọng nhất trong hàm này là tham số StartFunction đây là hàm cài đặt cho thread cần tạo. ThreadParameter là một biến 4 byte được truyền vào hàm MyThread biến pParam nếu không cần truyền tham số ta chỉ cần truyền NULL. Cách kết thúc một tiểu trình. Ngoài việc một luồng tự kết thúc khi hàm dùng để cài đặt luồng kết thúc ta còn có thể yêu cầu luồng kết thúc tức thời. Tuy nhiên việc kết thúc hàm theo kiểu “thô bạo” như vậy sẽ dẫn đến việc không hủy bỏ đúng đắn những tài nguyên đã được cấp như mở file kết nối mạng... Kết thúc luồng hiện hành: dùng hàm ExitThread(dwExitCode) trong đó dwExitCode là mã lỗi trả về thường là bằng 0. Để kết thúc một luồng khác ta phải có handle của luồng đó (hThread) được trả về khi tạo luồng khi đó dùng hàm TerminateThread(hThread dwExitCode) để kết thúc một luồng. Tóm lại để tạo một tiểu trình ta cần thực hiện theo các bước cơ bản sau đây:  Viết một hàm xử lý cho tiểu trình DWORD WINAPI ThreadProc( LPVOID Error! Hyperlink reference not valid.) { //...đoạn code xử lý cho tiểu trình return 0; -71- }  Khai báo một biến kiểu HANDLE để giữ lại Handle của Thread ví dụ: HANDLE hThread;  Gọi hàm CreateThread hThread = CreateThread(NULL 0 (LPTHREAD_START_ROUTINE)ThreadProc NULL 0 NULL); if (hThread == NULL) { //Không tạo được Thread }  Khi muốn kết thúc thread ta gọi hàm TerminateThread như sau: TerminateThread(hThread 0);//kết thúc luồng bất kỳ. Hoặc ExitThread(0);//Kết thúc luồng hiện hành. 4.3. Mô19BU tả hoạt động của ứng dụng minh họa. 4.3.1 Ứng53B dụng chat giữa Pocket PC với máy tính để bàn: -72- Server Client Tạo dịch vụ Kết nối server Tạo Nếu tuyến kết Nhận nối kết thành nối Gửi thông diệp công Tạo tuyến nhận thông điệp Kiểm tra nick Nếu Nếu -Thông điệp đến -“thanhcong”: Gán nick tạm chưa đã client khác. cho nick vừa nhận. tồn tồn -Gửi thông điệp -“exist”:Nhận nick tạm yêu tại tại “exit” nếu ngừng cầu tạo nick mới. kết nối. -“server exit”:Không thể kết nối server. - Lưu nick. - Lưu nick tạm thời. -“nick”:Lưu nick vào danh -Thông báo thành -Thông báo nick đã tồn sách đưa nick lên ListBox. công. Gửi nick vừa tại gửi “exist” và nick -“mess”:hiển thị thông điệp nhận cho các client và tạm thời. lên màn hình. ngược lại. -“exit”:Xóa nick vừa nhận ra khỏi danh sách xóa ra khỏi ListBox. Tạo tuyến Gửi về client xử lý -“taonick”:chưa tồn tại: Gán nick tạm cho nick vừa nhận.Gửi ”thanhcong” về client.Nếu tồn tại gửi “exist” về client. -“exit”: Xóa nick vừa nhận. Gửi “exit” và nick vừa nhần về cho các client khác. -Ngược lại nhận nick client gửi client nhận và thông điệp. Gửi nick”mess” thông điệp của client gửi cho client nhận. Hình 4.1 4.3.2 Ứng54B dụng điều khiển Power Point: -73- Server Pocket PC Tạo dịch vụ Kết nối server. Tiến trình Nhận Nếu kết nối. kết nối Power Point. Tạo thành tuyến công xử lý -Gửi các thông điệp: lên -Nhận các thông điệp biên dịch các thông xuống đầu trang cuối điệp thành mã phím tướng ứng gửi đến trang số trang bất kỳ Power Point.Nếu thông điệp “exit” đóng ”exit” đến server. socket đóng tuyến xử lý. Hình 4.2 4.4. Mô20BU tả thuộc tính phương thức chủ yếu của ứng dụng minh họa: 4.4.1 Ứng5B dụng chat giữa Pocket PC với máy tính để bàn: 4.4.1.1 Server:85B Lớp chủ yếu của Server là lớp CsocketServerDlg. 4.4.1.1.1 Thành105B phần dữ liệu chủ yếu: TênU dữ liệu: ChứcU năng: Socket skListenskAccept[100] Socket lưu thông tin Client. SOCKET hSock[100] Handle của skListenskAccept. HANDLE h[100] Handle của các tiểu trình. Client_Struct Cl[100] Cấu trúc của Client(gồm nickname, số thứ tự) ClistBox m_Danhsach ListBox thể hiện danh sách nickname client. Cbutton m_Taodichvu Biến điều khiển nút Tạo Dịch Vụ. 4.4.1.1.2 Phương106B thức chủ yếu: TênU phương thức ChứcU năng -74- void OnTaodichvu Tạo dịch vụ chat. DWORD INAPI ServiceThread Tạo tuyến chờ đợi kết nối. void ReceiveThread Tạo tuyến xử lý các thông điệp từ client. void OnThoatdichvu Thoát dịch vụ. void OnThoat,void OnClose Thoát chương trình. 4.4.1.2 Client:86B Lớp yếu CsocketClientDlg. 4.4.1.2.1 Thành107B phần dữ liệu: TênU dữ liệu. ChứcU năng. CSocket skSend Socket kết nối server. tongso Lưu trữ tổng số client. Client client[100] Lưu trữ thông tin client(nick, số thứ tự). m_Dsctongso Tổng số người được gửi(dịch vụ Conference). CString m_Danhsachchon[100] Danh sách người được chọn(dịch vụ Conference). BOOL m_Nhieunguo Biến xác định dịch vụ là gửi một người hay Conference. ClistBox m_Danhsach Listbox hiển thị nick name các client. Cstring m_ResultString Màn hình hiển thị kết quả. Cstring m_SendString Lưu trữ thông điệp cần gửi. 4.4.1.2.2 Phương108B thức: TênU phương thức ChứcU năng. -75- BOOL OnInitDialog Khởi tạo giá trị mặc định. void OnConnect Kết nối server. DWORD WINAPI Tuyến nhận thông điệp từ server. ReceiveThread DestroyWindow Xử lý sự kiện tắt cửa sổ. OnChon Kích hoạt dịch vụ Conference. OnThoichon Thoát dịch vụ Conference. OnSelchangeDanhsach Xử lý sự kiện chọn trên ListBox. 4.4.2 Ứng56B dụng điều khiển Power Point: 4.4.2.1 Server:87B 4.4.2.1.1 Thành109B phần dữ liệu: TênU dữ liệu ChứcU năng. HANDLE h Handle của tuyến tạo dịch vụ nhận thông điệp từ client CsocketskServerskClient,skServerskClient Socket tạo dịch vụ và socket lưu thông tin client. 4.4.2.1.2 Phương10B thức: TênU phương thức ChứcU năng. BOOL OnInitDialog Khởi tạo giá trị ban đầu cho dữ liệu void OnTaodichvu Tạo dịch vụ điều khiển Power Point. -76- DWORD WINAPI Tuyến nhận thông điệp từ client. ReceiveThread(LPVOID lp) HWND findWindowHandle Tìm Handle của các cửa sổ. 4.4.2.2 Client:8B 4.4.2.2.1 Thành1B phần dữ liệu: TênU dữ liệu. ChứcU năng. CSocket skClient Socket để kết nối server. CString ServerAddress Lưu địa chỉ server. Cstring m_So Lưu số slide cần hiển thị. 4.4.2.2.2 Phương12B thức: TênU phương thức ChứcU năng. BOOL DestroyWindow Xử lý sự kiện đóng cửa sổ. BOOL OnInitDialog Khởi tạo giá trị ban đầu cho dữ liệu. void OnKetnoiserver Kết nối server. OnLen Di chuyển lên. OnXuong Di chuyển xuống. OnDautrang Di chuyển lên đầu trang. OnCuoitrang Di chuyển xuông cuối trang. Ongui Gửi số trang bất kỳ. OnNgungketnoi Ngừng kết nối. 4.5. Mô21BU tả màn hình kết quả của ứng dụng -77- 4.5.1 Ứng57B dụng chat giữa Pocket PC với máy tính để bàn: 4.5

Các file đính kèm theo tài liệu này:

  • pdfchuyen_de_lap_trinh_mang_tren_may_pocket_pc.pdf