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
90 trang |
Chia sẻ: huong20 | Ngày: 07/01/2022 | Lượt xem: 349 | Lượt tải: 0
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:
- chuyen_de_lap_trinh_mang_tren_may_pocket_pc.pdf