194
Lã Thế Vinh Email: [email protected] Phone: 0985290681 Bộ môn KTMT 1

Bài giảng Lập trình mạng

  • Upload
    ctrl-man

  • View
    1.825

  • Download
    15

Embed Size (px)

Citation preview

1

• Lã Th Vinhế• Email: [email protected]• Phone: 0985290681• B môn KTMTộ

L ng Ánh Hoàngươ[email protected]

L P TRÌNH M NGẬ ẠNetwork Programming

• Cung c p các ki n th c c b n v l p trình ng d ng m ngấ ế ứ ơ ả ề ậ ứ ụ ạ–Xây d ng ng d ng Server.ự ứ ụ–Xây d ng ng d ng Client.ự ứ ụ–Các kỹ thu t vào ra.ậ

• Cung c p các kỹ năng c n thi t đ thi t k và xây d ng ng d ng ấ ầ ế ể ế ế ự ứ ụm ngạ–S d ng th vi n, môi tr ng, tài li u.ử ụ ư ệ ườ ệ–Thi t k , xây d ng ch ng trìnhế ế ự ươ .

M c đíchụ

3

• Yêu c u v ki n th c:ầ ề ế ứ– M ng máy tính.ạ– Ngôn ng l p trình C/C++.ữ ậ– Ngôn ng l p trình C#.ữ ậ– JAVA

• Lên l p đ y đớ ầ ủ

Yêu c uầ

4

• Th i l ng: 45 ti tờ ượ ế– Lý thuy t: 30 ti tế ế– Trình bày:15 ti tế

Th i l ng môn h cờ ượ ọ

5

• Network Programming for Microsoft Windows Second Edition. Anthony Jone, Jim Ohlun.

• C# Network Programming. Sybex

Tài li uệ

6

• Bài t p l n: 80%ậ ớ• Quá trình: 20%

Đánh giá

7

• Ch ng 1. Gi i thi u các mô hình l p trình m ng.ươ ớ ệ ậ ạ• Ch ng 2. B giao th c TCP/IPươ ộ ứ• Ch ng 3. Windows Socketươ• Ch ng 4. MFC Socketươ• Ch ng 5. .NET Socketươ

N i dungộ

8

L ng Ánh Hoàngươ[email protected]

Ch ng 1. Gi i thi u các mô ươ ớ ệhình l p trình m ngậ ạ

• 1.1. T ng quan v l p trình m ngổ ề ậ ạ• 1.2. Giao th c Internetứ

Ch ng 1. Gi i thi u các mô hình l p ươ ớ ệ ậtrình m ngạ

10

• Khái ni mệ– L p trình m ng là các kỹ thu t l p trình nh m xây ậ ạ ậ ậ ằ

d ng ng d ng, ph n m m khai thác hi u qu tài ự ứ ụ ầ ề ệ ảnguyên m ng máy tính.ạ

1.1. T ng quan v l p trình m ngổ ề ậ ạ

11

• Ngôn ng l p trình m ngữ ậ ạ– C/C++: M nh và ph bi n, đ c h u h t các l p trình ạ ổ ế ượ ầ ế ậ

viên s d ng đ vi t các ng d ng m ng hi u năng ử ụ ể ế ứ ụ ạ ệcao.

– Java: Khá thông d ng, s d ng nhi u trong các đi n ụ ử ụ ề ệtho i di đ ng (J2ME,Android).ạ ộ

– C#: M nh và d s d ng, tuy nhiên ch y trên n n .Net ạ ễ ử ụ ạ ềFramework và ch h tr h h đi u hành Windows.ỉ ỗ ợ ọ ệ ề

– Python, Perl, PHP...Ngôn ng thông d ch, s d ng đ ữ ị ử ụ ểvi t các ti n ích nh , nhanh chóngế ệ ỏ

– Giáo trình này sẽ ch đ c p đ n hai ngôn ng ỉ ề ậ ế ữ C/C++ và C#.

1.1. T ng quan v l p trình m ngổ ề ậ ạ

12

13

• M t s ví d v ng d ngộ ố ụ ề ứ ụ– Tìm ki m và t i nh c t website cho thi t b di đ ngế ả ạ ừ ế ị ộ

• Giao ti p v i các máy ch HTTPế ớ ủ• T i d li u html t máy ch HTTP và phân tíchả ữ ệ ừ ủ• T i d li u nh phân t máy ch HTTPả ữ ệ ị ừ ủ

– Đ ng b file gi a các thi t bồ ộ ữ ế ị• Cài đ t ph n m m ch trên PCặ ầ ề ủ• Giao ti p và truy n d li u gi a các thi t bế ề ữ ệ ữ ế ị

– Xem phim tr c tuy n ự ế• Giao ti p v i máy ch RTMP (Flash)ế ớ ủ• G i l nh k t n i và nh n d li u hình nh/âm ử ệ ế ố ậ ữ ệ ả

thanh

1.1. T ng quan v l p trình m ngổ ề ậ ạ

• Th vi nư ệ– Windows Socket API ( WinSock)

• Th vi n liên k t đ ng (WS2_32.DLL) đi kèm trong ư ệ ế ộh đi u hành Windows c a Microsoft.ệ ề ủ

• Th ng s d ng cùng v i C/C++.ườ ử ụ ớ• Cho hi u năng cao nh t.ệ ấ

– System.Net và System.Net.Sockets• Hai namespace trong b th vi n .NET c a Microsoftộ ư ệ ủ• D s d ngễ ử ụ• Th ng s d ng v i C#ườ ử ụ ớ

1.1. T ng quan v l p trình m ngổ ề ậ ạ

14

• Th vi nư ệ– MFC Socket

• N m trong b th vi n MFC c a Microsoftằ ộ ư ệ ủ• Đóng gói các hàm c a WinSock d i d ng các l p ủ ướ ạ ớ

h ng đ i t ng.ướ ố ượ• D s d ng và hi u năng cao.ễ ử ụ ệ

– Các th vi n c a các ngôn ng khác: Java, PHP, Python...ư ệ ủ ữ– Th vi n s d ng trong giáo trình: ư ệ ử ụ WinSock, MFC

Socket, System.Net và System.Net.Sockets

1.1. T ng quan v l p trình m ngổ ề ậ ạ

15

• Công c l p trìnhụ ậ– Visual Studio (6.0,

2003 .NET, 2005, 2008,2010)• R t m nhấ ạ• H tr c WinSock, MFC ỗ ợ ả

Socket và .NET Socket (Phiên b n 2003.NET tr ả ởlên).

• Cài thêm Visual Assist X– Dev C++

• Mi n phíễ• Ch h tr WinSockỉ ỗ ợ

1.1. T ng quan v l p trình m ngổ ề ậ ạ

16

• Công c g r iụ ỡ ố– TCPView: Hi n th các k t n i hi n t i c a máy tính.ể ị ế ố ệ ạ ủ– Resource Monitor: ~ TCPView.– Wireshark, Microsoft Network Monitor– Netcat (Netcat Win32)

1.1. T ng quan v l p trình m ngổ ề ậ ạ

17

• Tài li u tra c uệ ứ– Microsoft Developer

Network – MSDN• C c kỳ chi ti t và chuyên ự ế

nghi pệ• Công c không th thi uụ ể ế

– Google/BING

1.1. T ng quan v l p trình m ngổ ề ậ ạ

18

• Bài t p môn h c (yêu c u chung)ậ ọ ầ– Chia thành các nhóm, m i nhóm không quá 03 ng i, ỗ ườ

phân công công vi c rõ ràng. T ch c theo các module ệ ổ ứđ c l pộ ậ

– M i nhóm th c hi n 01 đ tài.ỗ ự ệ ề– M i đ tài không quá 02 nhóm th c hi n.ỗ ề ự ệ– Thang đi m t i đa 100. ể ố– Các ch ng trình có d u hi u gi ng/sao chép c a nhau ươ ấ ệ ố ủ

sẽ đ c 0 đi m.ượ ể– Có th s d ng OpenSource n u đ bài có ch rõ.ể ử ụ ế ề ỉ– M i nhóm có 45 phút trình bày ph ng án ti p c n và ỗ ươ ế ậ

các v n đ sẽ gi i quy tấ ề ả ế

1.1. T ng quan v l p trình m ngổ ề ậ ạ

19

• Bài t p môn h c (1 – FTP Client)ậ ọ– Vi t ch ng trình FTP Client th c hi n đ c ít nh t cế ươ ự ệ ượ ấ ác

ch c năng sau:ứ– Đăng nh p vậ ào m t mộ áy ch FTP.ủ– Hi n danh sệ ách các t p tin trên mệ áy ch .ủ– T i m t t p tin đ c ch n, có th t i b ng nhi u k t n i ả ộ ệ ượ ọ ể ả ằ ề ế ố

song song.– Upload đ c t p tin lên th m c đ c ch n.ượ ệ ư ụ ượ ọ– Đ i tên, xóa m t t p tin, th m c đ c ch nổ ộ ệ ư ụ ượ ọ– T o m t th m c m iạ ộ ư ụ ớ– Ngôn ng C/C++ữ /C#.– T l p trình m c SOCKETự ậ ứ– Tham kh o: FileZillaả

1.1. T ng quan v l p trình m ngổ ề ậ ạ

20

• Bài t p môn h c (2 – HTTP(S) Client)ậ ọ– Vi t ch ng trình t i t p tin theo giao th c HTTP(S) ế ươ ả ệ ứ

th c hi n đ c ít nh t cự ệ ượ ấ ác ch c năng sauứ– T i t p tin m t đ a ch xả ệ ở ộ ị ỉ ác đ nh.ị– Cho phép nh p s lu ng song song c n t i (đ c nh ậ ố ồ ầ ả ể ạ

tranh v i IDM ???).ớ– Cho phép nh p cậ ác thông s v ph m vi c a t p tin ố ề ạ ủ ệ

mu n t i (offset, length)ố ả– X lý đ c vi c t i file t đ ng t cử ượ ệ ả ự ộ ừ ác website chia s ẻ

thông d ng:ụ– Ngôn ng C/C++/C#ữ - S d ng TCP Socketử ụ

1.1. T ng quan v l p trình m ngổ ề ậ ạ

21

• Bài t p môn h c (3 – HTTP Server)ậ ọ– Vi t ch ng trình HTTP Server (HTTP/1.1) th c hi n ế ươ ự ệ

đ c ít nh t cượ ấ ác công vi c sau.ệ– X lý đ c cử ượ ác l nh: GET POST.ệ– Đáp ng đ c t i đa 6400 k t n i.ứ ượ ố ế ố– X lý đ c xử ượ ác th c client b ng password.ự ằ– Th ng kê vố à ghi nh t ký.ậ– Ngôn ng : C/C++ữ /C# - S d ng TCP Socketử ụ

1.1. T ng quan v l p trình m ngổ ề ậ ạ

22

• Bài t p môn h c (4 – Voice Chat)ậ ọ– u tiên thi t l p k t n i tr c ti p gi a cƯ ế ậ ế ố ự ế ữ ác client– Trong tr ng h p không th thi t l p k t n i tr c ti p ườ ợ ể ế ậ ế ố ự ế

thì có th trung gian qua serverể– Giao th c t thi t k , codec t ch n (mp3,wma,aac…). ứ ự ế ế ự ọ

Không truy n ề âm thanh ch a nén (wav,pcm).ư– Mã hóa kênh truy n theo gi i thu t tùy ch n.ề ả ậ ọ– Ngôn ng C/C++ữ /C#.– Cho phép s d ng OpenSource lame (ffmpeg) đ nén vử ụ ể à

gi i nén MP3.ả

1.1. T ng quan v l p trình m ngổ ề ậ ạ

23

• Bài t p môn h c (5 – Thông tin r p phim)ậ ọ ạ– T đ ng hi n th thông tin v : phim đang chi u r p, ự ộ ể ị ề ế ạ

show truy n hình đang chi u t i th i đi m hi n t i.ề ế ạ ờ ể ệ ạ– Các thông tin c n có v phim: Tên, Poster ( nh), Th ầ ề Ả ể

lo i, đạ ánh giá, tóm t t, trailer….(ngu n t imdb.com).ắ ồ ừ– Các thông tin c n có v show truy n hình: tên show, gi ầ ề ề ờ

phát.– Đ u vầ ào: 24h.com.vn, vtcv.vn, sctv.vn, platinumcineplex,

egastar, national cinema centre….– Cho phép đ t bặ áo th c đ n th i đi m m t phim/show ứ ế ờ ể ộ

truy n hình nề ào đó.– Ngôn ng : C/C++/C#ữ s d ng TCP Socketử ụ

1.1. T ng quan v l p trình m ngổ ề ậ ạ

24

• Bài t p môn h c (6 – RTMP GUI)ậ ọ– T đ ng l y c s d li u rtmp linksự ộ ấ ơ ở ữ ệ .– Phân tích / tách d li u đ t o link rtmp đ y đữ ệ ể ạ ầ ủ.– K t n i t i rtmp server đ download d li uế ố ớ ể ữ ệ .– Ghi nh t ký đ t o danh sách các server đang ho t đ ng ậ ể ạ ạ ộ

t tố– Cho phép dùng mã ngu n m : RTMPDUMPồ ở .– Ngôn ng : C/C++/C#ữ (n u thích)ế– Do RTMP quá ph c t p, nên nhóm ch c n tìm hi u c ứ ạ ỉ ầ ể ơ

ch k t n i, nhóm đ c khuy n khích dùng ngu n mế ế ố ượ ế ồ ở

1.1. T ng quan v l p trình m ngổ ề ậ ạ

25

• Bài t p môn h c (7 – Youtube Live Player)ậ ọ– K t n i t i Youtube liveế ố ớ .– L y danh sách kênh đang truy n hìnhấ ề– Phân tích d li u html đ l y liên k t http c a kênhữ ệ ể ấ ế ủ .– Http pseudo streaming.– Ngôn ng : C#ữ l p trình trên Windows Phoneậ– Đ c s tr giúp đ hi n th d li u videoượ ự ợ ể ể ị ữ ệ

1.1. T ng quan v l p trình m ngổ ề ậ ạ

26

• Bài t p môn h c (8 – Youtube Downloader)ậ ọ– K t n i t i Youtubeế ố ớ .– Th c hi n các search query (s d ng Google Data API)ự ệ ử ụ– Phân tích d li u html đ l y liên k t http c a m t ữ ệ ể ấ ế ủ ộ

video.– T i file FLV v máy sau đó tách âm thanh (mp3 ho c ả ề ặ

aac).– Ngôn ng : ữ C/C++/C#– T cài đ t ph n giao ti p m ng và t i d li u ự ặ ầ ế ạ ả ữ ệ– Ph n tách âm thanh có th dùng ngu n mầ ể ồ ở

1.1. T ng quan v l p trình m ngổ ề ậ ạ

27

• Bài t p môn h c (9 – 4Share Downloader)ậ ọ– Tìm hi u giao th c và API c a 4share.comể ứ ủ .– Vi t ch ng trình k t n i và đăng nh p 4shareế ươ ế ố ậ– Tìm ki m và hi n th danh sách bài hát (mp3) trên ế ể ị

4share– Nghe th và t i mp3 t 4shareử ả ừ .– Ngôn ng : C#ữ trên Windows Phone

1.1. T ng quan v l p trình m ngổ ề ậ ạ

28

• Bài t p môn h c (10 – Simple Email Client)ậ ọ– Tìm hi u giao th c POP3 (RFC 1939)ể ứ– Vi t ch ng trình k t n i và đăng nh p vào m t Pop3 ế ươ ế ố ậ ộ

server– Hi n th các email và tr ng thái t ng ng (đã đ c, ch a ể ị ạ ươ ứ ọ ư

đ c…)ọ– L y d li u email và hi n thấ ữ ệ ể ị.– T i và l u tr các file đính kèm n u cóả ư ữ ế– Ngôn ng : ữ C/C++/c#

1.1. T ng quan v l p trình m ngổ ề ậ ạ

29

• Bài t p môn h c (10)ậ ọ– K t n i t i Youtubeế ố ớ .– Th c hi n các search query (s d ng Google Data API)ự ệ ử ụ– Phân tích d li u html đ l y liên k t http c a m t ữ ệ ể ấ ế ủ ộ

video.– T i file FLV v máy sau đó tách âm thanh (mp3 ho c ả ề ặ

aac).– Ngôn ng : ữ C/C++/C#– T cài đ t ph n giao ti p m ng và t i d li u ự ặ ầ ế ạ ả ữ ệ– Ph n tách âm thanh có th dùng ngu n mầ ể ồ ở– Đ khó: ộ 3

1.1. T ng quan v l p trình m ngổ ề ậ ạ

30

31

• Bài t p môn h c (11)ậ ọ– Camera l p t i BUSắ ạ– 1 Máy tính nhúng có ph i ghép 3G (2 SIM) (LINUX)ố– Vi t code (LINUX)ế

• L y d li u nh t camera (http, authorization)ấ ữ ệ ả ừ• Jpeg ( nh r i)ả ờ• Yêu c u: nén thành video stream (FFMPEG)ầ• Xây d ng m t HTTP pseudo-streaming serverự ộ

1.1. T ng quan v l p trình m ngổ ề ậ ạ

• Giao th c Internet (Internet Protocol)ứ– Giao th c m ng thông d ng nh t trên th gi i.ứ ạ ụ ấ ế ớ– Thành công c a Internet là nh IPv4.ủ ờ– Đ c h tr trên t t c các h đi u hành.ượ ỗ ợ ấ ả ệ ề– Là công c s d ng đ l p trình ng d ng m ngụ ử ụ ể ậ ứ ụ ạ

1.2. Giao th c Internetứ

32

L ng Ánh Hoàngươ[email protected]

Ch ng 2. B giao th c Internetươ ộ ứTCP/IP

• 2.1. Gi i thi uớ ệ• 2.2. Giao th c IPv4ứ• 2.3. Giao th c IPv6ứ• 2.4. Giao th c TCPứ• 2.5. Giao th c UDPứ• 2.6. H th ng phân gi i tên mi nệ ố ả ề

Ch ng 2. B giao th c Internet ươ ộ ứ(TCP/IP)

34

• B giao th c Internetộ ứ– TCP/IP: Transmission Control Protocol/Internet

Protocol.– Là b giao th c truy n thông đ c s d ng trên ộ ứ ề ượ ử ụ

Internet và h u h t các m ng th ng m i.ầ ế ạ ươ ạ– Đ c chia thành các t ng g m nhi u giao th c, thu n ượ ầ ồ ề ứ ậ

ti n cho vi c qu n lý và phát tri n.ệ ệ ả ể– Là th hi n đ n gi n hóa c a mô hình lý thuy t OSI.ể ệ ơ ả ủ ế

2.1. Gi i thi uớ ệ

35

• B giao th c Internetộ ứ– G m b n t ngồ ố ầ

• T ng ng d ng – Application Layer.ầ ứ ụ• T ng giao v n – Transport Layer.ầ ậ• T ng Internet – Internet Layer.ầ• T ng truy nh p m ng – Network Access Layer.ầ ậ ạ

2.1. Gi i thi uớ ệ

36

• B giao th c Internetộ ứ– T ng ng d ngầ ứ ụ

• Đóng gói d li u ng i dùng theo giao th c riêng ữ ệ ườ ứvà chuy n xu ng t ng d i.ể ố ầ ướ

• Các giao th c thông d ng: HTTP, FTP, SMTP, POP3, ứ ụDNS, SSH, IMAP...

• Vi c l p trình m ng sẽ xây d ng ng d ng tuân ệ ậ ạ ự ứ ụtheo m t trong các giao th c t ng này ho c giao ộ ứ ở ầ ặth c do ng i phát tri n t đ nh nghĩaứ ườ ể ự ị

2.1. Gi i thi uớ ệ

37

• B giao th c Internetộ ứ– T ng giao v nầ ậ

• Cung c p d ch v truy n d li u gi a ng d ng - ấ ị ụ ề ữ ệ ữ ứ ụng d ng.ứ ụ

• Đ n v d li u là các đo n (segment,datagram)ơ ị ữ ệ ạ• Các giao th c t ng này: TCP, UDP, ICMP.ứ ở ầ• Vi c l p trình m ng sẽ s d ng d ch v do các giao ệ ậ ạ ử ụ ị ụ

th c t ng này cung c p đ truy n d li uứ ở ầ ấ ể ề ữ ệ

2.1. Gi i thi uớ ệ

38

• B giao th c Internetộ ứ– T ng Internetầ

• Đ nh tuy n và truy n các gói tin liên m ng.ị ế ề ạ• Cung c p d ch v truy n d li u gi a máy tính – ấ ị ụ ề ữ ệ ữ

máy tính trong cùng nhánh m ng ho c gi a các ạ ặ ữnhánh m ng.ạ

• Đ n v d li u là các gói tin (packet).ơ ị ữ ệ• Các giao th c t ng này: IPv4, IPv6....ứ ở ầ• Vi c l p trình ng d ng m ng sẽ r t ít khi can thi p ệ ậ ứ ụ ạ ấ ệ

vào t ng này, tr khi phát tri n m t giao th c liên ầ ừ ể ộ ứm ng m i.ạ ớ

2.1. Gi i thi uớ ệ

39

• B giao th c Internetộ ứ– T ng truy nh p m ngầ ậ ạ

• Cung c p d ch v truy n d li u gi a các nút m ng ấ ị ụ ề ữ ệ ữ ạtrên cùng m t nhánh m ng v t lý.ộ ạ ậ

• Đ n v d li u là các khung (frame).ơ ị ữ ệ• Ph thu c r t nhi u vào ph ng ti n k t n i v t ụ ộ ấ ề ươ ệ ế ố ậ

lý.• Các giao th c t ng này đa d ng: MAC, LLC, ADSL, ứ ở ầ ạ

802.11...• Vi c l p trình m ng t ng này là xây d ng các ệ ậ ạ ở ầ ự

trình đi u khi n ph n c ng t ng ng, th ng do ề ể ầ ứ ươ ứ ườnhà s n xu t th c hi n.ả ấ ự ệ

2.1. Gi i thi uớ ệ

40

• B giao th c Internetộ ứ– D li u g i đi qua m i t ng sẽ đ c thêm ph n thông ữ ệ ử ỗ ầ ượ ầ

tin đi u khi n (header).ề ể– D li u nh n đ c qua m i t ng sẽ đ c bóc tách ữ ệ ậ ượ ỗ ầ ượ

thông tin đi u khi n.ề ể

2.1. Gi i thi uớ ệ

41

• Giao th c IPv4ứ– Đ c IETF công b d i d ng RFC 791 vào 9/1981.ượ ố ướ ạ– Phiên b n th 4 c a h giao th c IP và là phiên b n ả ứ ủ ọ ứ ả

đ u tiên phát hành r ng rãi.ầ ộ– Là giao th c h ng d li u.ứ ướ ữ ệ– S d ng trong h th ng chuy n m ch gói.ử ụ ệ ố ể ạ– Truy n d li u theo ki u ề ữ ệ ể Best-Effort– Không đ m b o tính tr t t , trùng l p, tin c y c a gói ả ả ậ ự ặ ậ ủ

tin.– Ki m tra tính toàn v n c a d li u qua ể ẹ ủ ữ ệ checksum

2.2. Giao th c IPv4ứ

42

• Đ a ch IPv4ị ỉ– S d ng 32 bit đ đánh đ a ch các máy tính trong ử ụ ể ị ỉ

m ng.ạ– Bao g m: ph n m ng và ph n host.ồ ầ ạ ầ– S đ a ch t i đa: 2ố ị ỉ ố 32 ~ 4,294,967,296.– Dành riêng m t vài d i đ c bi t không s d ng.ộ ả ặ ệ ử ụ– Chia thành b n nhóm 8 bít (octet).ố

2.2. Giao th c IPv4ứ

43

D ng bi u di nạ ể ễ Giá trị

Nh phânị 11000000.10101000.00000000.00000001

Th p phânậ 192.168.0.1

Th p l c phânậ ụ 0xC0A80001

• Các l p đ a ch IPv4ớ ị ỉ– Có năm l p đ a ch : A,B,C,D,E.ớ ị ỉ– L p A,B,C: trao đ i thông tin thông th ng.ớ ố ườ– L p D: ớ multicast– L p E: đ dànhớ ể

2.2. Giao th c IPv4ứ

44

L pớ MSB Đ a ch đ uị ỉ ầ Đ a ch cu iị ỉ ố

A 0xxx 0.0.0.0 127.255.255.255

B 10xx 128.0.0.0 191.255.255.255

C 110x 192.0.0.0 223.255.255.255

D 1110 224.0.0.0 239.255.255.255

E 1111 240.0.0.0 255.255.255.255

• M t n m ng (Network Mask)ặ ạ ạ– Phân tách ph n m ng và ph n host trong đ a ch IPv4.ầ ạ ầ ị ỉ– S d ng trong b đ nh tuy n đ tìm đ ng đi cho gói ử ụ ộ ị ế ể ườ

tin.– V i m ng có d ngớ ạ ạ

2.2. Giao th c IPv4ứ

45

Network Host

192.168.0. 1

11000000.10101000.00000000. 00000001

46

• M t n m ng (Network Mask)ặ ạ ạ– Bi u di n theo d ng ể ễ ạ /n

• n là s bit dành cho ph n m ng.ố ầ ạ• Thí d : 192.168.0.1/24ụ

– Bi u di n d i d ng nh phânể ễ ướ ạ ị• Dùng 32 bit đánh d u, bít dành cho ph n m ng là ấ ầ ạ

1, cho ph n host là 0.ầ• Thí d : ụ 11111111.11111111.11111111.00000000

hay 255.255.255.0– Bi u di n d i d ng Hexaể ễ ướ ạ

• Dùng s Hexa: 0xFFFFFF00ố• Ít dùng

2.2. Giao th c IPv4ứ

47

• S l ng đ a ch trong m i m ngố ượ ị ỉ ỗ ạ– M i m ng sẽ có n bit dành cho ph n m ng, 32-n bit ỗ ạ ầ ạ

dành cho ph n host.ầ– Phân ph i đ a ch trong m i m ng:ố ị ỉ ỗ ạ

• 01 đ a ch m ng (các bit ph n host b ng 0).ị ỉ ạ ầ ằ• 01 đ a ch qu ng bá (các bit ph n host b ng 1).ị ỉ ả ầ ằ• 2n-2 đ a ch gán cho các máy tr m (host).ị ỉ ạ

– V i m ng 192.168.0.1/24ớ ạ• Đ a ch m ng: 192.168.0.0ị ỉ ạ• Đ a ch qu ng bá: 192.168.0.255ị ỉ ả• Đ a ch host: 192.168.0.1- 192.168.0.254ị ỉ

2.2. Giao th c IPv4ứ

48

• Các d i đ a ch đ c bi tả ị ỉ ặ ệ– Là nh ng d i đ c dùng v i m c đích riêng, không s ữ ả ượ ớ ụ ử

d ng đ c trên Internet.ụ ượ

2.2. Giao th c IPv4ứ

49

Đ a chị ỉ Di n gi iễ ả

10.0.0.0/8 M ng riêngạ

127.0.0.0/8 Đ a ch loopbackị ỉ

172.16.0.0/12 M ng riêngạ

192.168.0.0/16 M ng riêngạ

224.0.0.0/4 Multicast

240.0.0.0/4 D trự ữ

• D i đ a ch c c bả ị ỉ ụ ộ– Ch s d ng trong m ng n i b .ỉ ử ụ ạ ộ ộ– Kh c ph c v n đ thi u đ a ch c a IPv4.ắ ụ ấ ề ế ị ỉ ủ

2.2. Giao th c IPv4ứ

50

Tên D i đ a chả ị ỉ S l ng ố ượ Mô t m ngả ạ Vi t g nế ọ

Kh i 24-bitố10.0.0.0–

10.255.255.25516,777,216

M t d i tr n ộ ả ọv n thu c l p Aẹ ộ ớ

10.0.0.0/8

Kh i 20-bitố172.16.0.0–

172.31.255.2551,048,576

T h p t m ng ổ ợ ừ ạl p Bớ

172.16.0.0/12

Kh i 16-bitố192.168.0.0–

192.168.255.255

65,536T h p t m ng ổ ợ ừ ạ

l p Cớ192.168.0.0/16

• Giao th c IPv6ứ– IETF đ xu t năm 1998.ề ấ– S d ng 128 bit đ đánh đ a ch các thi t b .ử ụ ể ị ỉ ế ị– Kh c ph c v n đ thi u đ a ch c a IPv4.ắ ụ ấ ề ế ị ỉ ủ– V n ch a ph bi n và ch a th thay th hoàn toàn ẫ ư ổ ế ư ể ế

IPv4.

2.3. Giao th c IPv6ứ

51

• Giao th c TCP: Transmission Control Protocolứ– Giao th c lõi ch y t ng giao v n.ứ ạ ở ầ ậ– Ch y bên d i t ng ng d ng và trên n n IPạ ướ ầ ứ ụ ề– Cung c p d ch v truy n d li u theo dòng tin c y ấ ị ụ ề ữ ệ ậ

gi a các ng d ng.ữ ứ ụ– Đ c s d ng b i h u h t các ng d ng m ng.ượ ử ụ ở ầ ế ứ ụ ạ– Chia d li u thành các gói nh , thêm thông tin ki m ữ ệ ỏ ể

soát và g i đi trên đ ng truy n.ử ườ ề– L p trình m ng sẽ s d ng giao th c này đ trao đ i ậ ạ ử ụ ứ ể ổ

thông tin.

2.4. Giao th c TCPứ

52

• C ng (Port)ổ– M t s nguyên duy nh t trong kho ng 0-65535 t ng ộ ố ấ ả ươ

ng v i m t k t n i c a ng d ng.ứ ớ ộ ế ố ủ ứ ụ– TCP s d ng c ng đ chuy n d li u t i đúng ng ử ụ ổ ể ể ữ ệ ớ ứ

d ng ho c d ch v .ụ ặ ị ụ– M t ng d ng có th m nhi u k t n i => có th s ộ ứ ụ ể ở ề ế ố ể ử

d ng nhi u c ng.ụ ề ổ– M t s c ng thông d ng: HTTP(80), FTP(21), ộ ố ổ ụ

SMTP(25), POP3(110), HTTPS(443)...

2.4. Giao th c TCPứ

53

• Đ c tính c a TCPặ ủ– H ng k t n i: ướ ế ố connection oriented

• Hai bên ph i thi t l p kênh truy n tr c khi ả ế ậ ề ướtruy n d li u.ề ữ ệ

• Đ c th c hi n b i quá trình g i là b t tay ba b c ượ ự ệ ở ọ ắ ướ(three ways handshake).

– Truy n d li u theo dòng (ề ữ ệ stream oriented): t đ ng ự ộphân chia dòng d li u thành các đo n nh đ truy n ữ ệ ạ ỏ ể ềđi, t đ ng ghép các đo n nh thành dòng d li u và ự ộ ạ ỏ ữ ệg i tr ng d ng.ử ả ứ ụ

– Đúng tr t t (ordering guarantee): d li u g i tr c ậ ự ữ ệ ử ướsẽ đ c nh n tr cượ ậ ướ

2.4. Giao th c TCPứ

54

• Đ c tính c a TCPặ ủ– Tin c y, chính xác: thông tin g i đi sẽ đ c đ m b o ậ ử ượ ả ả

đ n đích, không d th a, sai sót...ế ư ừ– Đ tr l n, khó đáp ng đ c tính th i gian th c.ộ ễ ớ ứ ượ ờ ự

2.4. Giao th c TCPứ

55

• Header c a TCPủ– Ch a thông tin v đo n d li u t ng ngứ ề ạ ữ ệ ươ ứ

2.4. Giao th c TCPứ

56

TCP Header

Bit offset

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

0 Source port Destination port

32 Sequence number

64 Acknowledgment number

96 Data offset ReservedCWR

ECE

URG

ACK

PSH

RST

SYN

FIN

Window Size

128 Checksum Urgent pointer

160...

Options (if Data Offset > 5)...

• Các d ch v trên n n TCPị ụ ề– R t nhi u d ch v ch y trên n n TCP: FTP(21), ấ ề ị ụ ạ ề

HTTP(80), SMTP(25), SSH(22), POP3(110), VNC(4899)...

• S d ng netcat đ k t n i đ n m t d ch v ch y ử ụ ể ế ố ế ộ ị ụ ạtrên n n TCP:ề– nc.exe –vv [host] [port]– Thí dụ

nc.exe -vv www.google.com 80

2.4. Giao th c TCPứ

57

• Giao th c UDP: User Datagram Protocolứ– Cũng là giao th c lõi trong TCP/IP.ứ– Cung c p d ch v truy n d li u gi a các ng d ng.ấ ị ụ ề ữ ệ ữ ứ ụ– UDP chia nh d li u ra thành các ỏ ữ ệ datagram– S d ng trong các ng d ng kh t khe v m t th i ử ụ ứ ụ ắ ề ặ ờ

gian, ch p nh n sai sót: tho i, video, game...ấ ậ ạ

2.5. Giao th c UDPứ

58

• Đ c tính c a UDPặ ủ– Không c n thi t l p k t n i tr c khi truy n ầ ế ậ ế ố ướ ề

(Connectionless).– Nhanh, chi m ít tài nguyên d x lý.ế ễ ử– H n ch :ạ ế

• Không có c ch báo g i (report).ơ ế ử• Không đ m báo tr t t các datagram (ordering).ả ậ ự• Không phát hi n đ c m t mát ho c trùng l p ệ ượ ấ ặ ặ

thông tin (loss, duplication).

2.5. Giao th c UDPứ

59

• Header c a UDPủ

2.5. Giao th c UDPứ

60

+ Bits 0 - 15 16 - 31

0 Source Port Destination Port

32 Length Checksum

64 Data 

• Các d ch v trên n n UDPị ụ ề– Phân gi i tên mi n: DNS (53)ả ề– Streamming: MMS, RTSP...– Game

2.5. Giao th c UDPứ

61

• Đ a ch IP khó nh v i con ng i.ị ỉ ớ ớ ườ• DNS – Domain Name System

– H th ng phân c p làm nhi m v ánh x tên mi n ệ ố ấ ệ ụ ạ ềsang đ a ch IP và ng c l i.ị ỉ ượ ạ

2.6. H th ng phân gi i tên mi n DNSệ ố ả ề

62

• DNS – Domain Name System– Các tên mi n đ c phân c p và qu n lý b i INTERNICề ượ ấ ả ở– C p cao nh t là ROOT, sau đó là c p 1, c p 2,...ấ ấ ấ ấ– Thí d : ụ www.hut.edu.vn

2.6. H th ng phân gi i tên mi n DNSệ ố ả ề

63

C pấ C p 4ấ C p 3ấ C p 2ấ C p 1ấ

Tên mi nề www. hut. edu. vn

• DNS – Domain Name System– T ch c đ c c p tên mi n c p 1 sẽ duy trì c s d ổ ứ ượ ấ ề ấ ơ ở ữ

li u các tên mi n c p 2 tr c thu c, t ch c đ c c p ệ ề ấ ự ộ ổ ứ ượ ấtên mi n c p 2 sẽ duy trì c s d li u các tên mi n ề ấ ơ ở ữ ệ ềc p 3 tr c thu c...ấ ự ộ

– M t máy tính mu n bi t đ a ch c a m t máy ch có ộ ố ế ị ỉ ủ ộ ủtên mi n nào đó, nó sẽ h i máy ch DNS mà nó n m ề ỏ ủ ằtrong, n u máy ch DNS này không tr l i đ c nó sẽ ế ủ ả ờ ượchuy n ti p câu h i đ n máy ch DNS c p cao h n, ể ế ỏ ế ủ ấ ơDNS c p cao h n n u không tr l i đ c l i chuy n ấ ơ ế ả ờ ượ ạ ểđ n DNS c p cao h n n a...ế ấ ơ ữ

2.6. H th ng phân gi i tên mi n DNSệ ố ả ề

64

• DNS – Domain Name System– Vi c truy v n DNS sẽ do h đi u hành th c hi n.ệ ấ ệ ề ự ệ– D ch v DNS ch y c ng 53 UDP.ị ụ ạ ở ổ– Công c th nghi m: ụ ử ệ nslookup

• Thí d : ụ nslookup www.google.com

2.6. H th ng phân gi i tên mi n DNSệ ố ả ề

65

L ng Ánh Hoàngươ[email protected]

Ch ng 3. Windows Socketươ

• 3.1. Ki n trúcế• 3.2. Đ c tínhặ• 3.3. L p trình WinSockậ• 3.4. Các ph ng pháp vào raươ

Ch ng 3. Windows Socketươ

67

• Windows Socket (WinSock)– B th vi n liên k t đ ng c a Microsoft.ộ ư ệ ế ộ ủ– Cung c p các API dùng đ xây d ng ng d ng m ng ấ ể ự ứ ụ ạ

hi u năng cao.ệ

3.1 Ki n trúcế

68

ApplicationApplication

Winsock 2 DLL ( WS2_32.DLL)Winsock 2 DLL ( WS2_32.DLL)

Layered/Base ProviderLayered/Base Provider

RSVP Proxy Default Provider

MSAFD.DLL

Winsock Kernel Mode Driver (AFD.SYS)Winsock Kernel Mode Driver (AFD.SYS)

Transport ProtocolsTransport Protocols

• Windows Socket (WinSock)– Phiên b n hi n t i là WinSock 2.2ả ệ ạ– Các ng d ng sẽ giao ti p v i th vi n liên k t đ ng ứ ụ ế ớ ư ệ ế ộ ở

t ng trên cùng: ầ WS2_32.DLL.– Provider do nhà s n xu t c a các giao th c cung c p. ả ấ ủ ứ ấ

T ng này b sung giao th c c a các t ng m ng khác ầ ổ ứ ủ ầ ạnhau cho WinSock nh TCP/IP, IPX/SPX, AppleTalk, ưNetBIOS...t ng này v n ch y ầ ẫ ạ ở UserMode.

– WinSock Kernel Mode Driver (AFD.SYS) là driver ch y KernelMode, nh n d li u t t ng trên, qu n lý ạ ở ậ ữ ệ ừ ầ ảk t n i, b đ m, tài nguyên liên quan đ n socket và ế ố ộ ệ ếgiao ti p v i driver đi u khi n thi t b .ế ớ ề ể ế ị

3.1 Ki n trúcế

69

• Windows Socket (WinSock)– Transport Protocols là các driver t ng th p nh t, ở ầ ấ ấ

đi u khi n tr c ti p thi t b . Các driver này do nhà s n ề ể ự ế ế ị ảxu t ph n c ng xây d ng, và giao ti p v i ấ ầ ứ ự ế ớ AFD.SYS thông qua giao di n TDI ( Transport Driver Interface)ệ

– Vi c l p trình Socket sẽ ch thao tác v i đ i t ng ệ ậ ỉ ớ ố ượSOCKET.

– M i ng d ng c n có m t SOCKET tr c khi mu n trao ỗ ứ ụ ầ ộ ướ ốđ i d li u v i ng d ng khác.ổ ữ ệ ớ ứ ụ

– Đ ng dây o n i gi a các SOCKET sẽ là kênh truy n ườ ả ố ữ ềd li u c a hai ng d ng.ữ ệ ủ ứ ụ

3.1 Ki n trúcế

70

• H tr các giao th c h ng thông đi p (message ỗ ợ ứ ướ ệoriented)– Thông đi p truy n đi đ c tái t o nguyên v n c v ệ ề ượ ạ ẹ ả ề

kích th c và biên bên nh nướ ở ậ

3.2 Đ c tínhặ

71

• H tr các giao th c h ng dòng (stream ỗ ợ ứ ướoriented)– Biên c a thông đi p không đ c b o toàn khi truy n điủ ệ ượ ả ề

3.2 Đ c tínhặ

72

• H tr các giao th c h ng k t n i và không k t ỗ ợ ứ ướ ế ố ến iố– Giao th c h ng k t n i (connection oriented) th c ứ ướ ế ố ự

hi n thi t l p kênh truy n tr c khi truy n thông tin. ệ ế ậ ề ướ ềThí d : TCPụ

– Giao th c không k t n i (connectionless) không c n ứ ế ố ầthi t l p kênh truy n tr c khi truy n. Thí d : UDPế ậ ề ướ ề ụ

3.2 Đ c tínhặ

73

• H tr các giao th c h ng k t n i và không k t ỗ ợ ứ ướ ế ố ến iố– Giao th c h ng k t n i (connection oriented) th c ứ ướ ế ố ự

hi n thi t l p kênh truy n tr c khi truy n thông tin. ệ ế ậ ề ướ ềThí d : TCPụ

– Giao th c không k t n i (connection less) không c n ứ ế ố ầthi t l p kênh truy n tr c khi truy n. Thí d : UDPế ậ ề ướ ề ụ

3.2 Đ c tínhặ

74

• H tr các giao th c tin c y và tr t tỗ ợ ứ ậ ậ ự– Tin c y (reliability): đ m b o chính xác t ng byte đ c ậ ả ả ừ ượ

g i đ n đích.ử ế– Tr t t (ordering): đ m b o chính xác tr t t t ng byte ậ ự ả ả ậ ự ừ

d li u. Byte nào g i tr c sẽ đ c nh n tr c, byte ữ ệ ử ướ ượ ậ ướg i sau sẽ đ c nh n sau.ử ượ ậ

3.2 Đ c tínhặ

75

• Multicast– WinSock h tr các giao th c Multicast: g i d li u đ n ỗ ợ ứ ử ữ ệ ế

m t ho c nhi u máy trong m ng.ộ ặ ề ạ• Ch t l ng d ch v - Quality of Service (QoS)ấ ượ ị ụ

– Cho phép ng d ng yêu c u m t ph n băng thông dành ứ ụ ầ ộ ầriêng cho m c đích nào đó. Thí d : truy n hình th i ụ ụ ề ờgian th c.ự

3.2 Đ c tínhặ

76

• Chu n b môi tr ngẩ ị ườ– H đi u hành Windows XP/2003/Vista/7.ệ ề– Visual Studio C++– Th vi n tr c tuy n MSDNư ệ ự ế– Thêm tiêu đ WINSOCK2.H vào đ u m i t p mã ngu n.ề ầ ỗ ệ ồ– Thêm th vi n WS2_32.LIB vào m i Project b ng cáchư ệ ỗ ằ

Project => Property => Configuration Properties=> Linker=>Input=>Additional Dependencies

3.3 L p trình WinSockậ

77

• Kh i t o WinSockở ạ– WinSock c n đ c kh i t o đ u m i ng d ng tr c khi có th ầ ượ ở ạ ở ầ ỗ ứ ụ ướ ể

s d ngử ụ– Hàm WSAStartup sẽ làm nhi m kh i t oệ ở ạ

wVersionRequested: [IN] phiên b n WinSock c n dùng.ả ầ lpWSAData: [OUT] con tr ch a thông tin v WinSock cài đ t ỏ ứ ề ặ

trong h th ng.ệ ố Giá tr tr v : ị ả ề

Thành công: 0 Th t b i: SOCKET_ERRORấ ạ

3.3 L p trình WinSockậ

78

int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData);

• Kh i t o WinSockở ạ– Thí dụ

3.3 L p trình WinSockậ

79

WSADATA wsaData;WORD wVersion = MAKEWORD(2,2); // Kh i t o phiên b n ở ạ ả2.2if (WSAStartup(wVersion,&wsaData)) {

printf(“Version not supported”);}

• Gi i phóng WinSockả– ng d ng khi k t thúc s d ng WinSock có th g i hàm sau đ Ứ ụ ế ử ụ ể ọ ể

gi i phóng tài nguyên v cho h th ngả ề ệ ố int WSACleanup(void);

Giá tr tr v :ị ả ề Thành công: 0 Th t b i: SOCKET_ERRORấ ạ

3.3 L p trình WinSockậ

80

• Xác đ nh l iị ỗ– Ph n l n các hàm c a WinSock n u thành công đ u tr v 0.ầ ớ ủ ế ề ả ề– N u th t b i, giá tr tr v c a hàm là SOCKET_ERROR.ế ấ ạ ị ả ề ủ– ng d ng có th l y mã l i g n nh t b ng hàm Ứ ụ ể ấ ỗ ầ ấ ằ

int WSAGetLastError(void);– Tra c u l i v i công c ứ ỗ ớ ụ Error Lookup trong Visual Studio

3.3 L p trình WinSockậ

81

• T o SOCKETạ– SOCKET là m t s nguyên tr u t ng hóa k t n i m ng c a ng ộ ố ừ ượ ế ố ạ ủ ứ

d ng.ụ– ng d ng ph i t o SOCKET tr c khi có th g i nh n d li u.Ứ ụ ả ạ ướ ể ử ậ ữ ệ– Hàm socket đ c s d ng đ t o SOCKETượ ử ụ ể ạ

Trong đó: af: [IN] Address Family, h giao th c sẽ s d ng, th ng là ọ ứ ử ụ ườ

AF_INET, AF_INET6. type: [IN] Ki u socket, SOCK_STREAM cho TCP/IP và ể

SOCK_DGRAM cho UDP/IP. protocol: [IN] Giao th c t ng giao v n, IPPROTO_TCP ho c ứ ầ ậ ặ

IPPROTO_UDP

3.3 L p trình WinSockậ

82

SOCKET socket ( int af, int type, int protocol );

• T o SOCKETạ– Thí dụ

3.3 L p trình WinSockậ

83

SOCKET s1,s2; // Khai báo socket s1,s2

// T o socket TCPạs1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

// T o socket UDPạs2 = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

• Xác đ nh đ a chị ị ỉ– WinSock s d ng ử ụ sockaddr_in đ l u đ a ch c a ng d ng đích ể ư ị ỉ ủ ứ ụ

c n n i đ n. ầ ố ế– ng d ng c n kh i t o thông tin trong c u trúc nàyỨ ụ ầ ở ạ ấ

3.3 L p trình WinSockậ

84

struct sockaddr_in{ short sin_family; // H giao th c, th ng là AF_INETọ ứ ườ u_short sin_port; // C ng, d ng big-endianổ ạ struct in_addr sin_addr; // Đ a ch IPị ỉ char sin_zero[8]; // Không s d ng v i IPv4ử ụ ớ };

• Xác đ nh đ a chị ị ỉ– S d ng các hàm h tr :ử ụ ỗ ợ

• Chuy n đ i đ a ch IP d ng xâu sang s nguyên 32 bitể ổ ị ỉ ạ ố

• Chuy n đ i đ a ch t d ng ể ổ ị ỉ ừ ạ in_addr sang d ng xâuạ

• Chuy n đ i little-endian => big-endian (network order)ể ổ

• Chuy n đ i big-endian => little-endian (host order)ể ổ

3.3 L p trình WinSockậ

85

// Chuy n 4 byte t big-endian=>little-endianể ừu_long ntohl(u_long netlong)// Chuy n 2 byte t big-endian=>little-endianể ừu_short ntohs(u_short netshort)

unsigned long inet_addr(const char FAR *cp);

char FAR *inet_ntoa(struct in_addr in);

// Chuy n đ i 4 byte t little-endian=>big-endianể ổ ừu_long htonl(u_long hostlong)// Chuy n đ i 2 byte t little-endian=>big-endianể ổ ừu_short htons(u_short hostshort)

• Xác đ nh đ a chị ị ỉ– Thí d : đi n đ a ch 192.168.0.1:80 vào c u trúc sockaddr_inụ ề ị ỉ ấ

3.3 L p trình WinSockậ

86

SOCKADDR_IN InternetAddr; // Khai báo bi n l uế ư đ a chị ỉ InternetAddr.sin_family = AF_INET;// H đ a ch Internetọ ị ỉ

//Chuy n xâu đ a ch ể ị ỉ 192.168.0.1 sang s 4 byte dang network-ốbyte // order và gán cho tr ng sin_addrườInternetAddr.sin_addr.s_addr = inet_addr(“192.168.0.1");

//Chuy n đ i c ng sang d ng network-byte order và gán cho ể ổ ổ ạtr ng ườ // sin_portInternetAddr.sin_port = htons(80);

• Phân gi i tên mi nả ề– Đôi khi đ a ch c a máy đích đ c cho d i d ng tên mi nị ỉ ủ ượ ướ ạ ề– ng d ng c n th c hi n phân gi i tên mi n đ có đ a ch thích Ứ ụ ầ ự ệ ả ề ể ị ỉ

h pợ– Hàm getnameinfo và getaddrinfo s d ng đ phân gi i tên mi nử ụ ể ả ề– C n thêm t p tiêu đ WS2TCPIP.H ầ ệ ề

3.3 L p trình WinSockậ

87

int getaddrinfo( const char *nodename, // Tên mi n ho c đ a ch c n phân gi iề ặ ị ỉ ầ ả const char *servname, // D ch v ho c c ngị ụ ặ ổ const struct addrinfo *hints, // C u trúc g i ýấ ợ struct addrinfo **res // K t quế ả);Giá tr tr vị ả ề

Thành công: 0 Th t b i: mã l iấ ạ ỗ

Gi i phóng: ả freeaddrinfo()

• Phân gi i tên mi nả ề– C u trúc ấ addrinfo: danh sách liên k t đ n ch a thông tin v tên ế ơ ứ ề

mi n t ng ngề ươ ứ

3.3 L p trình WinSockậ

88

struct addrinfo {int ai_flags; // Th ng là AI_CANONNAMEườint ai_family; // Th ng là AF_INETườint ai_socktype; // Lo i socketạint ai_protocol; // Giao th giao v nứ ậsize_t ai_addrlen; // Chi u dài c a ai_addrề ủchar *ai_canonname; // Tên mi nềstruct sockaddr *ai_addr; // Đ a ch socket đã phân gi iị ỉ ảstruct addrinfo *ai_next; // Con tr t i c u trúc ti p theoỏ ớ ấ ế

};

• Phân gi i tên mi nả ề– Đo n ch ng trình sau sẽ th c hi n phân gi i đ a ch cho tên mi n ạ ươ ự ệ ả ị ỉ ề

www.hut.edu.vn

3.3 L p trình WinSockậ

89

addrinfo * result; // L u k t qu phân gi iư ế ả ảint rc; // L u mã tr vư ả ềsockaddr_in address; // L u đ a ch phân gi i đ cư ị ỉ ả ượrc = getaddrinfo(“www.hut.edu.vn”, “http”, NULL, &result);

// M t tên mi n có th có nhi u đ a ch IP t ng ngộ ề ể ề ị ỉ ươ ứ// L y k t qu đ u tiênấ ế ả ầif (rc==0) memcpy(&address,result->ai_addr,result->ai_addrlen);

// X lý v i address...ử ớ

• Truy n d li u s d ng TCPề ữ ệ ử ụ– Vi c truy n nh n d li u s d ng giao th c TCP sẽ bao g m hai ệ ề ậ ữ ệ ử ụ ứ ồ

ph n: ng d ng phía client và phía server.ầ ứ ụ– ng d ng phía server:Ứ ụ

• Kh i t o WinSock qua hàm ở ạ WSAStartup• T o SOCKET qua hàm ạ socket ho c ặ WSASocket• G n SOCKET vào m t giao di n m ng thông qua hàm ắ ộ ệ ạ bind• Chuy n SOCKET sang tr ng thái đ i k t n i qua hàm ể ạ ợ ế ố listen• Ch p nh n k t n i t client thông qua hàm ấ ậ ế ố ừ accept• G i d li u t i client thông qua hàm ử ữ ệ ớ send ho c ặ WSASend• Nh n d li u t client thông qua hàm ậ ữ ệ ừ recv ho c ặ WSARecv• Đóng SOCKET khi vi c truy n nh n k t thúc b ng hàm ệ ề ậ ế ằ

closesocket• Gi i phóng WinSock b ng hàm ả ằ WSACleanup

3.3 L p trình WinSockậ

90

• Truy n d li u s d ng TCPề ữ ệ ử ụ– ng d ng phía server (ti p)Ứ ụ ế

3.3 L p trình WinSockậ

91

WSAStartup

socket/WSASoc

ket

bindlisten

acceptsend/

WSASend

recv/WSARec

v

closesocket

WSACleanup

• Truy n d li u s d ng TCPề ữ ệ ử ụ– ng d ng phía server (ti p)Ứ ụ ế

• Hàm bind: g n SOCKET vào m t giao di n m ng c a máyắ ộ ệ ạ ủ

3.3 L p trình WinSockậ

92

int bind( SOCKET s, const struct sockaddr FAR* name, int namelen);

Trong đó s: [IN] SOCKET v a đ c t o b ng hàm socketừ ượ ạ ằ name: [IN] đ a ch c a giao di n m ng c c bị ỉ ủ ệ ạ ụ ộ namelen: [IN] chi u dài c a c u trúc nameề ủ ấ

Thí dụSOCKADDR_IN tcpaddr;short port = 8888;tcpaddr.sin_family = AF_INET;// Socket IPv4tcpaddr.sin_port = htons(port); // host order => net order tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY); //Giao di n b t kỳ ệ ấ bind(s, (SOCKADDR *)&tcpaddr, sizeof(tcpaddr)); // Bind socket

• Truy n d li u s d ng TCPề ữ ệ ử ụ– ng d ng phía server (ti p)Ứ ụ ế

• Hàm listen: chuy n SOCKET sang tr ng thái đ i k t n iế ạ ợ ế ố

3.3 L p trình WinSockậ

93

int listen(SOCKET s, int backlog);

Trong đó s: [IN] SOCKET đã đ c t o tr c đó b ng socket/WSASocketượ ạ ướ ằ backlog: [IN] chi u dài hàng đ i ch p nh n k t n iề ợ ấ ậ ế ố

• Truy n d li u s d ng TCPề ữ ệ ử ụ– ng d ng phía server (ti p)Ứ ụ ế

• Hàm accept: ch p nh n k t n iấ ậ ế ố

3.3 L p trình WinSockậ

94

SOCKET accept(SOCKET s, struct sockaddr FAR* addr,int FAR* addrlen);

Trong đó s: [IN] SOCKET h p l , đã đ c bind và listen tr c đóợ ệ ượ ướ addr: [OUT] đ a ch c a client k t n i đ nị ỉ ủ ế ố ế addrlen: [IN/OUT] con tr t i chi u dài c a c u trúc addr.ỏ ớ ề ủ ấ ng Ứ

d ng c n kh i t o addrlen tr t i m t s nguyên ch a chi u dài c a ụ ầ ở ạ ỏ ớ ộ ố ứ ề ủaddr

Giá tr tr v là m t SOCKET m i, s n sàng cho vi c g i nh n d li u trên ị ả ề ộ ớ ẵ ệ ử ậ ữ ệđó. ng v i m i k t n i c a client sẽ có m t SOCKET riêng.Ứ ớ ỗ ế ố ủ ộ

• Truy n d li u s d ng TCPề ữ ệ ử ụ– ng d ng phía server (ti p)Ứ ụ ế

• Hàm send: g i d li u trên SOCKETử ữ ệ

3.3 L p trình WinSockậ

95

int send(SOCKET s, const char FAR * buf, int len, int flags);Trong đó

s: [IN] SOCKET h p l , đã đ c accept tr c đóợ ệ ượ ướ buf: [IN] đ a ch c a b đ m ch a d li u c n g iị ỉ ủ ộ ệ ứ ữ ệ ầ ử len: [IN] s byte c n g iố ầ ử flags:[IN] c quy đ nh cách th c g i, có th là ờ ị ứ ử ể

0,MSG_OOB,MSG_DONTROUTEGiá tr tr vị ả ề

Thành công: s byte g i đ c, có th nh h n ố ử ượ ể ỏ ơ len Th t b i: SOCKET_ERRORấ ạ

Thí dụchar szHello[]=”Hello Network Programming”;send(s,szHello,strlen(szHello),0);

• Truy n d li u s d ng TCPề ữ ệ ử ụ– ng d ng phía server (ti p)Ứ ụ ế

• Hàm recv: nh n d li u trên SOCKETậ ữ ệ

3.3 L p trình WinSockậ

96

int recv(SOCKET s, const char FAR * buf, int len, int flags);Trong đó

s: [IN] SOCKET h p l , đã đ c accept tr c đóợ ệ ượ ướ buf: [OUT] đ a ch c a b đ m nh n d li uị ỉ ủ ộ ệ ậ ữ ệ len: [IN] kích th c b đ mướ ộ ệ flags:[IN] c quy đ nh cách th c nh n, có th là 0, MSG_PEEK, ờ ị ứ ậ ể

MSG_OOB, MSG_WAITALLGiá tr tr vị ả ề

Thành công: s byte nh n đ c, có th nh h n ố ậ ượ ể ỏ ơ len Th t b i: SOCKET_ERRORấ ạ

Thí dụchar buf[100];int len = 0;len = recv(s,buf,100,0);

• Truy n d li u s d ng TCPề ữ ệ ử ụ– ng d ng phía server (ti p)Ứ ụ ế

• Hàm closesocket: đóng k t n i trên m t socketế ố ộ

3.3 L p trình WinSockậ

97

int closesocket(SOCKET s )

Trong đó s: [IN] SOCKET h p l , đã k t n iợ ệ ế ố

Giá tr tr vị ả ề Thành công: 0 Th t b i: SOCKET_ERRORấ ạ

• Truy n d li u s d ng TCPề ữ ệ ử ụ– Đo n ch ng trình minh h aạ ươ ọ

3.3 L p trình WinSockậ

98

#include <winsock2.h> //Thu vien Winsockvoid main(void){ WSADATA wsaData; SOCKET ListeningSocket; SOCKET NewConnection; SOCKADDR_IN ServerAddr; SOCKADDR_IN ClientAddr; int ClientAddrLen; int Port = 8888; // Khoi tao Winsock 2.2 WSAStartup(MAKEWORD(2,2), &wsaData); // Tao socket lang nghe ket noi tu client. ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Khoi tao cau truc SOCKADDR_IN cua server // doi ket noi o cong 8888 ServerAddr.sin_family = AF_INET; ServerAddr.sin_port = htons(Port); ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);

• Truy n d li u s d ng TCPề ữ ệ ử ụ– Đo n ch ng trình minh h a (ti p)ạ ươ ọ ế

3.3 L p trình WinSockậ

99

// Bind socket cua server. bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)); // Chuyen sang trang thai doi ket noi listen(ListeningSocket, 5); // Chap nhan ket noi moi. ClientAddrLen = sizeof(ClientAddr); NewConnection = accept(ListeningSocket, (SOCKADDR *) &ClientAddr,&ClientAddrLen); // Sau khi chap nhan ket noi, server co the tiep tuc chap nhan them cac ket noi khac, // hoac gui nhan du lieu voi cac client thong qua cac socket duoc accept voi client // Dong socket closesocket(NewConnection); closesocket(ListeningSocket); // Giai phong Winsock WSACleanup();}

• Truy n d li u s d ng TCPề ữ ệ ử ụ– ng d ng phía clientỨ ụ

• Kh i t o WinSock qua hàm ở ạ WSAStartup• T o SOCKET qua hàm ạ socket ho c ặ WSASocket• Đi n thông tin v server vào c u trúc ề ề ấ sockaddr_in• K t n i t i server qua hàm ế ố ớ connect ho c ặ WSAConnect• G i d li u t i server thông qua hàm ử ữ ệ ớ send ho c ặ WSASend• Nh n d li u t server thông qua hàm ậ ữ ệ ừ recv ho c ặ WSARecv• Đóng SOCKET khi vi c truy n nh n k t thúc b ng hàm ệ ề ậ ế ằ

closesocket• Gi i phóng WinSock b ng hàm ả ằ WSACleanup

3.3 L p trình WinSockậ

100

• Truy n d li u s d ng TCPề ữ ệ ử ụ– ng d ng phía client (ti p)Ứ ụ ế

3.3 L p trình WinSockậ

101

WSAStartup

socket/WSASock

etxác đ nh ị

đ a ịch /phân ỉgi i tên ả

mi nề

connect/WSAConn

ect

send/WSASend

recv/WSARecv

closesocket

WSACleanup

• Truy n d li u s d ng TCPề ữ ệ ử ụ– ng d ng phía client (ti p)Ứ ụ ế

• Đ a ch c a server xác đ nh trong c u trúc ị ỉ ủ ị ấ sockaddr_in nh ờhàm inet_addr ho c theo ặ getaddrinfo

• Hàm connect: k t n i đ n serverế ố ế

3.3 L p trình WinSockậ

102

int connect(SOCKET s,const struct sockaddr FAR* name,int namelen);

Trong đó s: [IN] SOCKET đã đ c t o b ng ượ ạ ằ socket ho c ặ WSASocket tr c đóướ name:[IN] đ a ch c a serverị ỉ ủ namelen:[IN] chi u dài c u trúc ề ấ name

Giá tr tr vị ả ề Thành công: 0 Th t b i: SOCKET_ERRORấ ạ

• Truy n d li u s d ng TCPề ữ ệ ử ụ– Ch ng trình minh h aươ ọ

3.3 L p trình WinSockậ

103

#include <winsock2.h> void main(void){ WSADATA wsaData; SOCKET s; SOCKADDR_IN ServerAddr; int Port = 8888; // Khoi tao Winsock 2.2  WSAStartup(MAKEWORD(2,2), &wsaData); // Tao socket client s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Khoi tao cau truc SOCKADDR_IN co dia chi server la 202.191.56.69 va cong 8888  ServerAddr.sin_family = AF_INET; ServerAddr.sin_port = htons(Port); ServerAddr.sin_addr.s_addr = inet_addr("202.191.56.69");

• Truy n d li u s d ng TCPề ữ ệ ử ụ– Ch ng trình minh h a (ti p)ươ ọ ế

3.3 L p trình WinSockậ

104

// Ket noi den server thong qua socket s.  connect(s, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr)); // Bat dau gui nhan du lieu  // Ket thuc gui nhan du lieu // Dong socket closesocket(s);  // Giai phong Winsock  WSACleanup();} 

• Bài t pậ1. Vi t ch ng trình TCPClient, k t n i đ n m t máy ch xác đ nh ế ươ ế ố ế ộ ủ ịb i tên mi n ho c đ a ch IP. Sau đó nh n d li u t bàn phím và g i ở ề ặ ị ỉ ậ ữ ệ ừ ửđ n Server. Tham s đ c truy n vào t dòng l nh có d ngế ố ượ ề ừ ệ ạ

TCPClient.exe <Địa chỉ IP/Tên miền><Cổng>2. Vi t ch ng trình TCPServer, đ i k t n i c ng xác đ nh b i tham ế ươ ợ ế ố ở ổ ị ởs dòng l nh. M i khi có client k t n i đ n, thì g i xâu chào đ c ch ố ệ ỗ ế ố ế ử ượ ỉra trong m t t p tin xác đ nh, sau đó ghi toàn b n i dung client g i ộ ệ ị ộ ộ ửđ n vào m t t p tin khác đ c ch ra trong tham s dòng l nhế ộ ệ ượ ỉ ố ệ

TCPServer.exe <C ng> <T p tin ch a câu chào> <T p tin l u n i dung client ổ ệ ứ ệ ư ộg i đ n>ử ế

VD: TCPServer.exe 8888 chao.txt client.txt

3.3 L p trình WinSockậ

105

• Truy n d li u s d ng UDPề ữ ệ ử ụ– Giao th c UDP là giao th c không k t n i (Connectionless)ứ ứ ế ố– ng d ng không c n ph i thi t l p k t n i tr c khi g i tin.Ứ ụ ầ ả ế ậ ế ố ướ ử– ng d ng có th nh n đ c tin t b t kỳ máy tính nào trong Ứ ụ ể ậ ượ ừ ấ

m ng.ạ– Trình t g i thông tin bên g i nh sauự ử ở ử ư

3.3 L p trình WinSockậ

106

WSAStartupsocket/

WSASocket

Xác đ nh đ a ị ịch /Phân gi i ỉ ả

tên mi nề

sendto WSACleanup

• Truy n d li u s d ng UDPề ữ ệ ử ụ– ng d ng bên g iỨ ụ ử

• Hàm sendto: g i d li u đ n m t máy tính b t kỳử ữ ệ ế ộ ấ

3.3 L p trình WinSockậ

107

int sendto( SOCKET s, // [IN] socket đã t o b ng hàm socket/WSASocketạ ằ const char FAR * buf, // [IN] b đ m ch a d li u c n g iộ ệ ứ ữ ệ ầ ử int len, // [IN] s byte c n g iố ầ ử int flags, // [IN] c , t ng t nh hàm sendờ ươ ự ư const struct sockaddr FAR * to, // [IN] đ a ch đíchị ỉ int tolen // [IN] chi u dài đ a ch đíchề ị ỉ);Giá tr tr vị ả ề

Thành công: s byte g i đ c, có th nh h n ố ử ượ ể ỏ ơ len Th t b i: SOCKET_ERRORấ ạ

• Truy n d li u s d ng UDPề ữ ệ ử ụ– Đo n ch ng trình sau sẽ g i m t xâu t i đ a ch ạ ươ ử ộ ớ ị ỉ

202.191.56.69:8888

3.3 L p trình WinSockậ

108

char buf[]=”Hello Network Programming”; // Xâu c n g iầ ửSOCKET sender; // SOCKET đ g iể ửSOCKADDR_IN receiverAddr; // Đ a ch nh nị ỉ ậ // T o socket đ g i tinạ ể ửsender = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Đi n đ a ch đíchề ị ỉreceiverAddr.sin_family = AF_INET;receiverAddr.sin_port = htons(8888); receiverAddr.sin_addr.s_addr = inet_addr("202.191.56.69");// Th c hi n g i tinự ệ ửsendto(sender, buf, strlen(buf), 0, (SOCKADDR *)&receiverAddr, sizeof(receiverAddr));

• Truy n d li u s d ng UDPề ữ ệ ử ụ– Trình t nh n thông tin bên nh n nh sauự ậ ở ậ ư

3.3 L p trình WinSockậ

109

WSAStartupsocket/

WSASocket

bind

recvfrom WSACleanup

• Truy n d li u s d ng UDPề ữ ệ ử ụ– ng d ng bên nh nỨ ụ ậ

• Hàm recvfrom: nh n d li u t m t socketậ ữ ệ ừ ộ

3.3 L p trình WinSockậ

110

int recvfrom( SOCKET s, // [IN] SOCKET sẽ nh n d li uậ ữ ệ char FAR* buf, // [IN] đ a ch b đ m ch a d li u sẽ nh n đ cị ỉ ộ ệ ứ ữ ệ ậ ượ int len, // [IN] kích th c b đ m ướ ộ ệ int flags, // [IN] c , t ng t nh hàm recvờ ươ ự ư struct sockaddr FAR* from,// [OUT] đ a ch c a bên g iị ỉ ủ ử int FAR* fromlen // [IN/OUT] chi u dài c u trúc đ a ch c a bên ề ấ ị ỉ ủ

// g i, kh i t o là chi u dài c a fromử ở ạ ề ủ);Giá tr tr v ị ả ề

Thành công: s byte nh n đ cố ậ ượ Th t b i: SOCKET_ERRORấ ạ

• Truy n d li u s d ng UDPề ữ ệ ử ụ– Đo n ch ng trình sau sẽ nh n đ li u datagram t c ng 8888 và ạ ươ ậ ữ ệ ừ ổ

hi n th ra màn hìnhể ị

3.3 L p trình WinSockậ

111

SOCKET receiver;SOCKADDR_IN addr, source; int len = sizeof(source);// T o socket UDPạreceiver = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);// Kh i t o đ a ch và c ng 8888ở ạ ị ỉ ổ addr.sin_family = AF_INET;addr.sin_addr.s_addr = htonl(INADDR_ANY);addr.sin_port = htons(8888); // Đ i UDP datagram c ng 8888ợ ở ổ // Bind socket vào t t c các giao di n và c ng 8888ấ ả ệ ổbind(receiver,(sockaddr*)&addr,sizeof(SOCKADDR_IN));

• Truy n d li u s d ng UDPề ữ ệ ử ụ– Đo n ch ng trình (ti p)ạ ươ ế

3.3 L p trình WinSockậ

112

// L p đ i gói tinặ ợwhile (1){

// Nh n d li u t m ngậ ữ ệ ừ ạdatalen = recvfrom(receiver,buf,100,0,(sockaddr*)&source,

&len);// Ki m tra chi u dàiể ềif (datalen>0){

buf[datalen]=0;printf("Data:%s",buf); // Hi n th ra màn hìnhể ị

}}

• S d ng Netcat đ g i nh n d li u đ n gi nử ụ ể ử ậ ữ ệ ơ ả– Netcat là m t ti n ích m ng r t đa năng.ộ ệ ạ ấ– Có th s d ng nh TCP server: nc.exe -v -l -p <ể ử ụ ư c ng đ i k t ổ ợ ế

n iố >Thí d :ụ nc.exe -l -p 8888

– Có th s d ng nh TCP client: nc -v <ể ử ụ ư ip/tên mi nề > <c ngổ > Thí d :ụ nc.exe 127.0.0.1 80

– S d ng nh UDP receiver: nc -v -l -u -p <ử ụ ư c ng đ i k t n iổ ợ ế ố >Thí d : nc.exe -v -l -u -p 8888ụ

– S d ng nh UDP sender: nc -v -u <ử ụ ư ip/tên mi nề > <c ngổ >– Thí d : nc.exe -v -u 192.168.0.1 80 ụ

3.3 L p trình WinSockậ

113

• M t s hàm khácộ ố– getpeername: l y đ a ch đ u kia mà SOCKET k t n i đ nấ ị ỉ ầ ế ố ế

– getsockname: l y đ a ch c c b c a SOCKETấ ị ỉ ụ ộ ủ

3.3 L p trình WinSockậ

114

int getpeername( SOCKET s, // [IN] SOCKET c n l y đ a chầ ấ ị ỉ struct sockaddr FAR* name, // [OUT] đ a ch l y đ cị ỉ ấ ượ int FAR* namelen // [OUT] chi u dài đ a chề ị ỉ);

int getsockname( SOCKET s, // [IN] SOCKET c n l y đ a chầ ấ ị ỉ struct sockaddr FAR* name, // [OUT] đ a ch l y đ cị ỉ ấ ượ int FAR* namelen // [OUT] chi u dài đ a chề ị ỉ);

• Bài t pậ1. Vi t ch ng trình ế ươ clientinfo th c hi n k t n i đ n m t máy ch ự ệ ế ố ế ộ ủxác đ nh và g i thông tin v tên máy, danh sách các đĩa có trong ị ử ề ổmáy, kích th c các đĩa. Đ a ch (tên mi n) và c ng nh n vào t ướ ổ ị ỉ ề ổ ậ ừtham s dòng l nh. ố ệ

VD: clientinfo abc.com 12342. Vi t ch ng trình ế ươ serverinfo đ i k t n i t ợ ế ố ừ các clientinfo và thu nh n thông tin t client, hi n ra màn hình. Tham s dòng l nh truy n ậ ừ ệ ố ệ ềvào là c ng mà serverinfo sẽ đ i k t n iổ ợ ế ố

VD: serverinfo 1234

3.3 L p trình WinSockậ

115

3.4 Các ph ng pháp vào raươ

116

• Các ch đ ho t đ ng c a WinSockế ộ ạ ộ ủ– Thread( Lu ng): ồ

• Là đ n v th c thi đ c l p và tu n t c a ch ng trình.ơ ị ự ộ ậ ầ ự ủ ươ• M i ch ng trình có ít nh t m t thread chính là thread b t đ u ỗ ươ ấ ộ ắ ầ

th c hi n t i hàm ự ệ ạ main– Blocking (Đ ng b ):ồ ộ

• Là ch đ mà các hàm vào ra sẽ ch n thread đ n khi thao tác ế ộ ặ ếvào ra hoàn t t (các hàm vào ra sẽ không tr v cho đ n khi thao ấ ở ề ếtác hoàn t t).ấ

• Là ch đ m c đ nh c a SOCKETế ộ ặ ị ủ• Các hàm nh h ng:ả ưở

– accept– connect– send– recv– ...

3.4 Các ph ng pháp vào raươ

117

• Các ch đ ho t đ ng c a WinSockế ộ ạ ộ ủ– Blocking (Đ ng b ):ồ ộ

I/O Request

I/O Complete

Blocking state

Application

Perform I/O

OS

3.4 Các ph ng pháp vào raươ

118

• Các ch đ ho t đ ng c a WinSockế ộ ạ ộ ủ– Blocking (Đ ng b ):ồ ộ

• Thích h p v i các ng d ng x lý tu n t . Không nên g i các ợ ớ ứ ụ ử ầ ự ọhàm blocking khi thread x lý giao di n (GUI Thread).ở ử ệ

• Thí d : ụ– Thread b ch n b i hàm ị ặ ở recv thì không th g i d li uể ử ữ ệ

...do{

// Thread sẽ b ch n l i khi g i hàm recvfromị ặ ạ ọ// Trong lúc đ i d li u thì không th g i d li uợ ữ ệ ể ử ữ ệrc = recvfrom(receiver,szXau,128,0,

(sockaddr*)&senderAddress,&senderLen);// ..

}while...

3.4 Các ph ng pháp vào raươ

119

• Các ch đ ho t đ ng c a WinSockế ộ ạ ộ ủ– Non-Blocking (B t đ ng b ):ấ ồ ộ

• Là ch đ mà các thao tác vào ra sẽ tr v n i g i ngay l p t c ế ộ ở ề ơ ọ ậ ứvà ti p t c th c thi thread. K t qu c a thao tác vào ra sẽ đ c ế ụ ự ế ả ủ ượthông báo cho ch ng trình d i m t c ch đ ng b nào đó.ươ ướ ộ ơ ế ồ ộ

• Các hàm vào ra b t đ ng b sẽ tr v mã l i ấ ồ ộ ả ề ỗWSAWOULDBLOCK n u thao tác đó không th hoàn t t ngay ế ể ấvà m t th i gian đáng k (ch p nh n k t n i, nh n d li u, g i ấ ờ ể ấ ậ ế ố ậ ữ ệ ửd li u...). Đây là đi u hoàn toàn bình th ng.ữ ệ ề ườ

• Có th s d ng trong thread x lý giao di n c a ng d ng.ể ử ụ ử ệ ủ ứ ụ• Thích h p v i các ng d ng h ng s ki n.ợ ớ ứ ụ ướ ự ệ

3.4 Các ph ng pháp vào raươ

120

• Các ch đ ho t đ ng c a WinSockế ộ ạ ộ ủ– Non-Blocking (B t đ ng b ):ấ ồ ộ

I/O Request

I/O Complete

Non-Blocking state

Application

Perform I/O

OS

OtherComputations

3.4 Các ph ng pháp vào raươ

121

• Các ch đ ho t đ ng c a WinSockế ộ ạ ộ ủ– Non-Blocking (B t đ ng b ):ấ ồ ộ

• Socket c n chuy n sang ch đ này b ng hàm ầ ể ế ộ ằ ioctlsocketSOCKET s;unsigned long ul = 1;int nRet; s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// Chuy n sang ch đ non-blockingể ế ộnRet = ioctlsocket(s, FIONBIO, (unsigned long *) &ul);if (nRet == SOCKET_ERROR){ // Th t b iấ ạ}

3.4 Các ph ng pháp vào raươ

122

• Các mô hình vào ra c a WinSockủ• Mô hình Blocking

– Mô hình m c đ nh, đ n gi n nh t.ặ ị ơ ả ấ– Không th g i nh n d li u đ ng th i trong cùng m t lu ng.ể ử ậ ữ ệ ồ ờ ộ ồ– Ch nên áp d ng trong các ng d ng đ n gi n, x lý tu n t , ít k t n i.ỉ ụ ứ ụ ơ ả ử ầ ự ế ố– Gi i quy t v n đ x lý song song b ng vi c t o thêm các thread chuyên bi t: thread ả ế ấ ề ử ằ ệ ạ ệ

g i d li u, thread nh n d li uử ữ ệ ậ ữ ệ– Hàm API CreateThread đ c s d ng đ t o m t lu ng m iượ ử ụ ể ạ ộ ồ ớ

HANDLE WINAPI CreateThread( __in LPSECURITY_ATTRIBUTES lpThreadAttributes, __in SIZE_T dwStackSize, __in LPTHREAD_START_ROUTINE lpStartAddress, __in LPVOID lpParameter, __in DWORD dwCreationFlags, __out LPDWORD lpThreadId );

- TerminateThread- BOOL WINAPI TerminateThread( __in_out HANDLE hThread,

__in DWORD dwExitCode );

- Trên unix/linux/posix: pthread_create và pthread_kill

3.4 Các ph ng pháp vào raươ

123

• Các mô hình vào ra c a WinSockủ• Mô hình Blocking

Receiver Thread

socket

bind

listen

accept

recvsend

other tasksother tasks

CreateThread

Main Thread

3.4 Các ph ng pháp vào raươ

124

• Các mô hình vào ra c a WinSockủ• Mô hình Blocking

– Đo n ch ng trình sau sẽ minh h a vi c g i và nh n d li u đ ng th i trong ạ ươ ọ ệ ử ậ ữ ệ ồ ờTCP Client

// Khai báo lu ng x lý vi c nh n d li uồ ử ệ ậ ữ ệDWORD WINAPI ReceiverThread(LPVOID lpParameter);...// Khai báo các bi n toàn c cế ụSOCKADDR_IN address;SOCKET client; char szXau[128];...rc = connect(client,(sockaddr*)&address,sizeof(address));// T o lu ng x lý vi c nh n d li uạ ồ ử ệ ậ ữ ệCreateThread(0,0,ReceiverThread,0,0,0);while (strlen(gets(szXau))>=2){

rc = send(client,szXau,strlen(szXau),0);}...

3.4 Các ph ng pháp vào raươ

125

• Các mô hình vào ra c a WinSockủ• Mô hình Blocking

– Đo n ch ng trình (ti p)ạ ươ ếDWORD WINAPI ReceiverThread(LPVOID lpParameter){

char szBuf[128];int len = 0;do{

len = recv(client,szBuf,128,0);if (len>=2){

szBuf[len] = 0;printf("%s\n",szBuf);

}else

break;}while (len>=2);

}

3.4 Các ph ng pháp vào raươ

126

• Các mô hình vào ra c a WinSockủ• Mô hình Select

– Là mô hình đ c s d ng ph bi n.ượ ử ụ ổ ế– S d ng hàm ử ụ select đ thăm dò các s ki n trên socket (g i d li u, nh n d ể ự ệ ử ữ ệ ậ ữ

li u, k t n i thành công, yêu c u k t n i...).ệ ế ố ầ ế ố– H tr nhi u k t n i cùng m t lúc.ỗ ợ ề ế ố ộ– Có th x lý t p trung t t c các socket trong cùng m t thread (t i đa 1024).ể ử ậ ấ ả ộ ố– Nguyên m u hàm nh sauẫ ư

int select( int nfds, // Không s d ngử ụ fd_set FAR * readfds, // T p các socket hàm sẽ thăm dò cho s ki n readậ ự ệ fd_set FAR * writefds, // T p các socket hàm sẽ thăm dò cho s ki n writeậ ự ệ fd_set FAR * exceptfds, // T p các socket hàm sẽ thăm dò cho s ki n exceptậ ự ệ const struct timeval FAR * timeout // Th i gian thăm dò t i đaờ ố);Giá tr tr v :ị ả ề

Thành công: s l ng socket có s ki n x y raố ượ ự ệ ả H t gi : 0ế ờ Th t b i: SOCKET_ERRORấ ạ

3.4 Các ph ng pháp vào raươ

127

• Các mô hình vào ra c a WinSockủ• Mô hình Select

socket

bind

listen

Kh i t o t p selectở ạ ậ

X lý s ki n ử ự ệ

K t thúc ?ế

select

Main Thread

Nclosesocket

Y

3.4 Các ph ng pháp vào raươ

128

• Các mô hình vào ra c a WinSockủ• Mô hình Select

Đi u ki n thành công c a ề ệ ủ select M t trong các socket c a t p readfds nh n đ c d li u ho c k t n i b ộ ủ ậ ậ ượ ữ ệ ặ ế ố ị

đóng, reset, h y, ho c hàm accept thành công.ủ ặ M t trong các socket c a t p writefds có th g i d li u, ho c hàm connect ộ ủ ậ ể ử ữ ệ ặ

thành công trên socket non-blocking. M t trong các socket c a t p exceptfds nh n đ c d li u OOB, ho c ộ ủ ậ ậ ượ ữ ệ ặ

connect th t b i.ấ ạ Các t p readfds, writefds, exceptfds có th NULL, nh ng không th c ba cùng ậ ể ư ể ả

NULL. Các MACRO FD_CLR, FD_ZERO, FD_ISSET, FD_SET s d ng đ thao tác v i các c u ử ụ ể ớ ấ

trúc fdset.

3.4 Các ph ng pháp vào raươ

129

• Các mô hình vào ra c a WinSockủ• Mô hình Select

Đo n ch ng trình sau sẽ thăm dò tr ng thái c a socket s khi nào có d li uạ ươ ạ ủ ữ ệSOCKET s;fd_set fdread;int ret;// Kh i t o socket s và t o k t n iở ạ ạ ế ố ...// Thao tác vào ra trên socket swhile(TRUE){ // Xóa t p fdreadậ FD_ZERO(&fdread); // Thêm s vào t p fdreadậ FD_SET(s, &fdread); ret = select(0, &fdread, NULL, NULL, NULL); // Đ i s ki n trên socket ợ ự ệ if (ret == SOCKET_ERROR) {

// X lý l iử ỗ}

3.4 Các ph ng pháp vào raươ

130

• Các mô hình vào ra c a WinSockủ• Mô hình Select

Đo n ch ng trình (ti p)ạ ươ ế if (ret > 0) { // Ki m tra xem s có đ c thi t l p hay khôngể ượ ế ậ if (FD_ISSET(s, &fdread)) { // Đ c d li u t sọ ữ ệ ừ } }}

3.4 Các ph ng pháp vào raươ

131

Bài t p: Simple Telnet Serverậ• S d ng mô hình select vi t hai ch ng trình server/client th c hi n ử ụ ế ươ ự ệ

yêu c u sau:ầ– Vi t ch ng trình server đ i k t n i c ng 12345.ế ươ ợ ế ố ở ổ– V i m i client k t n i đ n, yêu c u nh p tên và m t kh u. So sánh tên và m t ớ ỗ ế ố ế ầ ậ ậ ẩ ậ

kh u trong t p tin passwd g m nhi u dòng có d ng:ẩ ệ ồ ề ạuser1:pass1user2:pass2…

– N u đăng nh p thành công thì đ i l nh t client và chuy n ti p l nh cho h th ng ế ậ ợ ệ ừ ể ế ệ ệ ốx lý, sau đó g i tr k t qu cho client.ử ử ả ế ả

Ví d :ụHello guest, please authenticate yourselfUsername: nonamePassword: nopassWelcome to noname serverC:\Program files>dir /ah<K t qu >ế ảC:\Program files>cd \C:\

132

• Vi t ch ng trình SelectTCPServer có th th c hi n nh ng ế ươ ể ự ệ ữcông vi c sau:ệ– Đáp ng đ c t i đa 255 k t n i.ứ ượ ố ế ố– S d ng mô hình Select.ử ụ– Đ nh danh các client b ng nicknameị ằ– Chuy n ti p thông đi p t m t nickname đ n t t c các ể ế ệ ừ ộ ế ấ ả

nickname khác đang đăng nh p vào h th ng.ậ ệ ố– Cú pháp đăng nh p c a m t client:ậ ủ ộ

• “Hello <nickname>\r\n”– Cú pháp g i thông đi p c a m t nickname đ n h th ng ử ệ ủ ộ ế ệ ố

• “Chat <n i dung>\r\n”ộ– Cú pháp g i thông đi p c a h th ng đ n m t clientử ệ ủ ệ ố ế ộ

• “Chat <nickname> <n i dung>\r\n”ộ

3.4 Các ph ng pháp vào raươ

133

• Các mô hình vào ra c a WinSockủ• Mô hình WSAAsyncSelect

C ch x lý s ki n d a trên thông đi p c a Windowsơ ế ử ự ệ ự ệ ủ ng d ng GUI có th nh n đ c các thông đi p t WinSock qua c a s c a ng Ứ ụ ể ậ ượ ệ ừ ử ổ ủ ứ

d ng.ụ Hàm WSAAsyncSelect đ c s d ng đ chuy n socket sang ch đ b t đ ng b ượ ử ụ ể ể ế ộ ấ ồ ộ

và thi t l p tham s cho vi c x lý s ki nế ậ ố ệ ử ự ệ

int WSAAsyncSelect( SOCKET s, // [IN] Socket sẽ x lý s ki nử ự ệ HWND hWnd, // [IN] Handle c a s nh n s ki nử ổ ậ ự ệ unsigned int wMsg, // [IN] Mã thông đi p, tùy ch n, th ng>=WM_USERệ ọ ườ long lEvent // [IN] M t n ch a các s ki n ng d ng mu n nh nặ ạ ứ ự ệ ứ ụ ố ậ

// bao g m FD_READ, ồ //FD_WRITE,FD_ACCEPT,FD_CONNECT,FD_CLOSE

);

3.4 Các ph ng pháp vào raươ

134

• Các mô hình vào ra c a WinSockủ• Mô hình WSAAsyncSelect

Thí d : ụ WSAAsyncSelect(s, hwnd, WM_SOCKET, FD_CONNECT | FD_READ | FD_WRITE | FD_CLOSE);

T t c các c a s đ u có hàm callback đ nh n s ki n t Windows. Khi ng ấ ả ử ổ ề ể ậ ự ệ ừ ứd ng đã đăng ký socket v i c a s nào, thì c a s đó sẽ nh n đ c các s ki n ụ ớ ử ổ ử ổ ậ ượ ự ệc a socket.ủ

Nguyên m u c a hàm callback c a c a s :ẫ ủ ủ ử ốLRESULT CALLBACK WindowProc(

HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );

Khi c a s nh n đ c các s ki n liên quan đ n WinSock:ử ổ ậ ượ ự ệ ế uMsg sẽ ch a mã thông đi p mà ng d ng đã đăng ký b ng ứ ệ ứ ụ ằ

WSAAsyncSelect wParam ch a b n thân socket x y ra s ki nứ ả ả ự ệ N a cao c a lParam ch a mã l i n u có, n a th p ch a mã s ki n có th ử ủ ứ ỗ ế ử ấ ứ ự ệ ể

là FD_READ, FD_WRITE, FD_CONNECT, FD_ACCEPT, FD_CLOSE

3.4 Các ph ng pháp vào raươ

135

• Các mô hình vào ra c a WinSockủ• Mô hình WSAAsyncSelect

ng d ng sẽ dùng hai MACRO: WSAGETSELECTERROR và Ứ ụWSAGETSELECTEVENT đ ki m tra l i và s ki n x y ra trên socket.ể ể ỗ ự ệ ả

Thí d :ụBOOL CALLBACK WinProc(HWND hDlg,UINT wMsg, WPARAM wParam, LPARAM lParam){ SOCKET Accept;  switch(wMsg) { case WM_PAINT: // X lý s ki n khácử ự ệ

break;  case WM_SOCKET: // S ki n WinSockự ệ  if (WSAGETSELECTERROR(lParam)) // Ki m tra có l i hay khôngể ỗ

{closesocket( (SOCKET) wParam); // Đóng socket

break; }

 

3.4 Các ph ng pháp vào raươ

136

• Các mô hình vào ra c a WinSockủ• Mô hình WSAAsyncSelect

Thí d (ti p):ụ ếswitch(WSAGETSELECTEVENT(lParam)) // Xác đ nh s ki n ị ự ệ { case FD_ACCEPT: // Ch p nh n k t n iấ ậ ế ố  Accept = accept(wParam, NULL, NULL); …. break; case FD_READ: // Có d li u t socket wParamữ ệ ừ

… break; case FD_WRITE: // Có th g i d li u đ n socket wParamể ử ữ ệ ế

break; case FD_CLOSE: // Đóng k t n iế ố

closesocket( (SOCKET)wParam); break; } break; } return TRUE;}

3.4 Các ph ng pháp vào raươ

137

• Các mô hình vào ra c a WinSockủ• Mô hình WSAAsyncSelect

u đi m: x lý hi u qu nhi u s ki n trong cùng m t lu ng.Ư ể ử ệ ả ề ự ệ ộ ồ Nh c đi m: ng d ng ph i có ít nh t m t c a s , không nên d n quá nhi u ượ ể ứ ụ ả ấ ộ ử ổ ồ ề

socket vào cùng m t c a s vì sẽ d n t i đình tr trong vi c x lý giao di n.ộ ử ổ ẫ ớ ệ ệ ử ệ

3.4 Các ph ng pháp vào raươ

138

• Các mô hình vào ra c a WinSockủ• Mô hình WSAEventSelect

X lý d a trên c ch đ ng b đ i t ng s ki n c a Windows: ử ự ơ ế ồ ộ ố ượ ự ệ ủ WSAEVENT M i đ i t ng có hai tr ng thái: Báo hi u (signaled) và ch a báo hi u (non-ỗ ố ượ ạ ệ ư ệ

signaled). Hàm WSACreateEvent sẽ t o m t đ i t ng s ki n tr ng thái ch a báo hi u và ạ ộ ố ượ ự ệ ở ạ ư ệ

có ch đ ho t đ ng là thi t l p th công (manual reset).ế ộ ạ ộ ế ậ ủWSAEVENT WSACreateEvent(void);

Hàm WSAResetEvent sẽ chuy n đ i t ng s ki n v tr ng thái ch a báo hi u ể ố ượ ự ệ ề ạ ư ệBOOL WSAResetEvent(WSAEVENT hEvent);

Hàm WSACloseEvent sẽ gi i phóng m t đ i t ng s ki nả ộ ố ượ ự ệBOOL WSACloseEvent(WSAEVENT hEvent);

3.4 Các ph ng pháp vào raươ

139

• Các mô hình vào ra c a WinSockủ• Mô hình WSAEventSelect

Hàm WSAEventSelect sẽ t đ ng chuy n socket sang ch đ non-blocking và g n ự ộ ể ế ộ ắcác s ki n c a socket v i đ i t ng s ki n truy n vào theo tham sự ệ ủ ớ ố ượ ự ệ ề ốint WSAEventSelect(

SOCKET s, // [IN] Socket c n x lý s ki nầ ử ự ệWSAEVENT hEventObject,// [IN] Đ i t ng s ki n đã t o tr c ố ượ ự ệ ạ ướ

đólong lNetworkEvents // [IN] Các s ki n ng d ng mu n nh n ự ệ ứ ụ ố ậ

// t WinSockừ);

Thí d : ụ rc = WSAEventSelect(s, hEventObject, FD_READ|FD_WRITE);

3.4 Các ph ng pháp vào raươ

140

• Các mô hình vào ra c a WinSockủ• Mô hình WSAEventSelect

Hàm WaitForMultipleEvent sẽ đ i s ki n trên m t m ng các đ i t ng s ki n ợ ự ệ ộ ả ố ượ ự ệcho đ n khi m t trong các đ i t ng chuy n sang tr ng thái báo hi u.ế ộ ố ượ ể ạ ệDWORD WSAWaitForMultipleEvents( DWORD cEvents, // [IN] S l ng s ki n c n đ iố ượ ự ệ ầ ợ const WSAEVENT FAR * lphEvents,// [IN] M ng các s ki n, max 64ả ự ệ BOOL fWaitAll, //[IN] Có đ i t t c các s ki n không ?ợ ấ ả ự ệ DWORD dwTimeout, //[IN] Th i gian đ i t i đaờ ợ ố BOOL fAlertable //[IN] Thi t l p là FALSEế ậ);Giá tr tr vị ả ề Thành công: S th t c a s ki n x y ra + WSA_WAIT_EVENT_0.ố ứ ự ủ ự ệ ả H t gi : WSA_WAIT_TIMEOUT.ế ờ Th t b i: WSA_WAIT_FAILED.ấ ạ

3.4 Các ph ng pháp vào raươ

141

• Các mô hình vào ra c a WinSockủ• Mô hình WSAEventSelect

Xác đ nh mã c a s ki n g n v i m t đ i t ng s ki n c th b ng hàm ị ủ ự ệ ắ ớ ộ ố ượ ự ệ ụ ể ằWSAEnumNetworkEvents.int WSAEnumNetworkEvents( SOCKET s, // [IN] Socket mu n thăm dòố WSAEVENT hEventObject, // [IN] Đ i t ng s ki n t ng ng ố ượ ự ệ ươ ứ LPWSANETWORKEVENTS lpNetworkEvents// [OUT] C u trúc ch a mã s ki nấ ứ ự ệ);

Mã s ki n l i n m trong c u trúc WSANETWORKEVENTS có khai báo nh sauự ệ ạ ằ ấ ưtypedef struct _WSANETWORKEVENTS{

long lNetworkEvents; // M t n ch a s ki n đ c kích hoặ ạ ứ ự ệ ượint iErrorCode[FD_MAX_EVENTS]; // M ng các mã s ki nả ự ệ

} WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;

3.4 Các ph ng pháp vào raươ

142

• Các mô hình vào ra c a WinSockủ• Mô hình WSAEventSelect

Thí dụ#include <winsock2.h>#define MAX_EVENTS 64int _tmain(int argc, _TCHAR* argv[]){SOCKET SocketArray [MAX_EVENTS];WSAEVENT EventArray [MAX_EVENTS],NewEvent;SOCKADDR_IN InternetAddr;SOCKET Accept, Listen;DWORD EventTotal = 0;DWORD Index, i;WSADATA wsaData;WORD wVersion = MAKEWORD(2,2);int rc = WSAStartup(wVersion,&wsaData);// Thi t l p TCP socket đ i k t n i 8888ế ậ ợ ế ố ởListen = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);InternetAddr.sin_family = AF_INET;InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);InternetAddr.sin_port = htons(8888);rc = bind(Listen, (PSOCKADDR) &InternetAddr,sizeof(InternetAddr));

3.4 Các ph ng pháp vào raươ

143

• Các mô hình vào ra c a WinSockủ• Mô hình WSAEventSelect

Thí d (ti p)ụ ếSOCKET Accept, Listen;…NewEvent = WSACreateEvent(); WSAEventSelect(Listen, NewEvent,FD_ACCEPT | FD_CLOSE);rc = listen(Listen, 5);WSANETWORKEVENTS NetworkEvents;SocketArray[EventTotal] = Listen;EventArray[EventTotal] = NewEvent;EventTotal++;char buffer[1024];int len;while(TRUE){ // Đ i t t c các s ki nợ ấ ả ự ệ Index = WSAWaitForMultipleEvents(EventTotal,EventArray, FALSE,

WSA_INFINITE, FALSE); Index = Index - WSA_WAIT_EVENT_0;

3.4 Các ph ng pháp vào raươ

144

• Các mô hình vào ra c a WinSockủ• Mô hình WSAEventSelect

Thí d (ti p)ụ ế// Duy t đ tìm ra s ki n nào đ c báo hi u ệ ể ự ệ ượ ệ for(i=Index; i < EventTotal ;i++) { Index = WSAWaitForMultipleEvents(1, &EventArray[i], TRUE, 1000,

FALSE); if ((Index == WSA_WAIT_FAILED) || (Index == WSA_WAIT_TIMEOUT)) continue; else { Index = i; WSAResetEvent(EventArray[Index]); WSAEnumNetworkEvents( SocketArray[Index], EventArray[Index], &NetworkEvents);

3.4 Các ph ng pháp vào raươ

145

• Các mô hình vào ra c a WinSockủ• Mô hình WSAEventSelect

Thí d (ti p)ụ ế // Ki m tra s ki n FD_ACCEPTể ự ệ if (NetworkEvents.lNetworkEvents & FD_ACCEPT) { if (NetworkEvents.iErrorCode[FD_ACCEPT_BIT] != 0) { printf("FD_ACCEPT failed with error %d\n", NetworkEvents.iErrorCode[FD_ACCEPT_BIT]); break; }

// Ch p nh n k t n i m iấ ậ ế ố ớ // cho vào danh sách socket và s ki nự ệ Accept = accept( SocketArray[Index], NULL, NULL);

3.4 Các ph ng pháp vào raươ

146

• Các mô hình vào ra c a WinSockủ• Mô hình WSAEventSelect

Thí d (ti p)ụ ếif (EventTotal > WSA_MAXIMUM_WAIT_EVENTS) { printf("Too many connections"); closesocket(Accept); break; }

NewEvent = WSACreateEvent();

WSAEventSelect(Accept, NewEvent, FD_READ | FD_WRITE | FD_CLOSE);

EventArray[EventTotal] = NewEvent; SocketArray[EventTotal] = Accept; EventTotal++; printf("Socket %d connected\n", Accept); }...

147

148

• Vi t ch ng trình chat+g i file đ n gi n (client ế ươ ử ơ ả+server) s d ng mô hình WSAEventSelect. Có th ử ụ ểnh p và hi n th ti ng Vi t. Có qu n lý username, ậ ể ị ế ệ ảpassword.

N i dung l u trong xâu có ki u wchar_t. S l ng ộ ư ể ố ượbyte g i đi = chi u dài xâu * 2.ử ề

Bài t pậ

149

• Thi t k và cài đ t m t giao th c cho phép g i file ế ế ặ ộ ứ ửvà văn b n đ ng th i trên ả ồ ờ m tộ k t n i TCP. ế ố

• Thi t k và cài đ t m t giao th c cho phép g i file ế ế ặ ộ ứ ửvà văn b n đ ng th i trên ả ồ ờ m tộ socket UDP.

Bài t pậ

3.4 Các ph ng pháp vào raươ

150

• Các mô hình vào ra c a WinSockủ• Mô hình Overlapped

S d ng c u trúc OVERLAPPED ch a thông tin v thao tác vào ra.ử ụ ấ ứ ề Các thao tác vào ra sẽ tr v ngay l p t c và thông báo l i cho ng d ng theo m t ở ề ậ ứ ạ ứ ụ ộ

trong hai cách sau: Event đ c ch ra trong c u trúc OVERLAPPED.ượ ỉ ấ Completion routine đ c ch ra trong tham s c a l i g i vào ra.ượ ỉ ố ủ ờ ọ

Các hàm vào ra s d ng mô hình này:ử ụ WSASend WSASendTo WSARecv WSARecvFrom WSAIoctl WSARecvMsg AcceptEx ConnectEx TransmitFile TransmitPackets DisconnectEx WSANSPIoctl

3.4 Các ph ng pháp vào raươ

151

• Các mô hình vào ra c a WinSockủ• Mô hình Overlapped– X lý qua ử event

C u trúc OVERLAPPEDấtypedef struct WSAOVERLAPPED{ DWORD Internal; DWORD InternalHigh; DWORD Offset; DWORD OffsetHigh; WSAEVENT hEvent;} WSAOVERLAPPED, FAR * LPWSAOVERLAPPED

Internal, InternalHigh,Offset,OffsetHigh đ c s d ng n i b trong WinSockượ ử ụ ộ ộhEvent là đ i t ng ố ượ event sẽ đ c báo hi u khi thao tác vào ra hoàn t t, ch ng ượ ệ ấ ươ

trình c n kh i t o c u trúc v i m t đ i t ng s ki n h p l .ầ ở ạ ấ ớ ộ ố ượ ự ệ ợ ệKhi thao tác vào ra hoàn t t, ch ng trình c n l y k t qu vào ra thông qua hàm ấ ươ ầ ấ ế ả

WSAGetOverlappedResult

3.4 Các ph ng pháp vào raươ

152

• Các mô hình vào ra c a WinSockủ• Mô hình Overlapped– X lý qua ử event

‒ Hàm WSAGetOverlappedResultBOOL WSAGetOverlappedResult( SOCKET s, LPWSAOVERLAPPED lpOverlapped, LPDWORD lpcbTransfer, BOOL fWait, LPDWORD lpdwFlags);

s là socket mu n ki m tra k t quố ể ế ảlpOverlapped là con tr đ n c u trúc OVERLAPPEDỏ ế ấlpcbTransfer là con tr đ n bi n sẽ l u s byte trao đ i đ cỏ ế ế ư ố ổ ượfWait là bi n báo cho hàm đ i cho đ n khi thao tác vào ra hoàn t tế ợ ế ấlpdwFlags : c k t qu c a thao tácờ ế ả ủHàm tr v TRUE n u thao tác hoàn t t ho c FALSE n u thao tác ch a hoàn t t, có l i ả ề ế ấ ặ ế ư ấ ỗ

ho c không th xác đ nh.ặ ể ị

3.4 Các ph ng pháp vào raươ

153

• Các mô hình vào ra c a WinSockủ• Mô hình Overlapped – X lý qua ử event

– T o đ i t ng event v i ạ ố ượ ớ WSACreateEvent.– Kh i t o c u trúc OVERLAPPED v i event v a t o.ở ạ ấ ớ ừ ạ– G i yêu c u vào ra v i tham s là c u trúc OVERLAPPED v a t o, ử ầ ớ ố ấ ừ ạ tham

s liên quan đ n CompletionRoutine ph i luôn b ng NULLố ế ả ằ .– Đ i thao tác k t thúc qua hàm ợ ế WSAWaitForMultipleEvents.– Nh n k t qu vào ra qua hàm WSAGetOverlappedResultậ ế ả

3.4 Các ph ng pháp vào raươ

154

• Các mô hình vào ra c a WinSockủ• Mô hình Overlapped – Thí d x lý qua ụ ử event

// Kh i t o WinSock và k t n i đ n 127.0.0.1:8888ở ạ ế ố ế…OVERLAPPED overlapped; // Khai báo c u trúc OVERLAPPEDấWSAEVENT receiveEvent = WSACreateEvent(); // T o eventạmemset(&overlapped,0,sizeof(overlapped));overlapped.hEvent = receiveEvent;

char buff[1024]; // B đ m nh n d li uộ ệ ậ ữ ệWSABUF databuff; // C u trúc mô t b đ mấ ả ộ ệdatabuff.buf = buff;databuff.len = 1024;DWORD bytesReceived = 0; // S byte nh n đ cố ậ ượDWORD flags = 0; / C quy đ nh cách nh n, b t bu c ph i cóờ ị ậ ắ ộ ả

while (1){

DWORD flags = 0;// G i yêu c u nh n d li uử ầ ậ ữ ệrc = WSARecv(s,&databuff,1,&bytesReceived,&flags,&overlapped,0);

3.4 Các ph ng pháp vào raươ

155

• Các mô hình vào ra c a WinSockủ• Mô hình Overlapped – Thí d x lý qua ụ ử event

if (rc == SOCKET_ERROR){

rc = WSAGetLastError();if (rc != WSA_IO_PENDING) {

printf("Loi %d !\n",rc);continue;

}};rc = WSAWaitForMultipleEvents(1,&receiveEvent,TRUE,WSA_INFINITE,FALSE);if ((rc == WSA_WAIT_FAILED)||(rc==WSA_WAIT_TIMEOUT)) continue;WSAResetEvent(receiveEvent);rc = WSAGetOverlappedResult(s,&overlapped,&bytesReceived,FALSE,&flags);// Ki m tra l iể ỗ…// Hi n thể ịbuff[bytesReceived] = 0;printf(buff);}

3.4 Các ph ng pháp vào raươ

156

• Các mô hình vào ra c a WinSockủ• Mô hình Overlapped – X lý Completion Routineử

– H th ng sẽ thông báo cho ng d ng bi t thao tác vào ra k t thúc thông qua m t ệ ố ứ ụ ế ế ộhàm callback g i là ọ Completion Routine

– Nguyên m u c a hàm nh sauẫ ủ ưvoid CALLBACK CompletionROUTINE(

IN DWORD dwError, // Mã l iỗIN DWORD cbTransferred, // S byte trao đ iố ổIN LPWSAOVERLAPPED lpOverlapped, // C u trúc lpOverlapped ấ

// t ng ngươ ứIN DWORD dwFlags ); // C k t qu thao tác vào raờ ế ả

– WinSock sẽ b qua tr ng ỏ ườ event trong c u trúc OVERLAPPED, vi c t o đ i t ng ấ ệ ạ ố ượevent và thăm dò là không c n thi t n a.ầ ế ữ

3.4 Các ph ng pháp vào raươ

157

• Các mô hình vào ra c a WinSockủ• Mô hình Overlapped – X lý Completion Routineử

– ng d ng c n chuy n lu ng sang tr ng thái Ứ ụ ầ ể ồ ạ alertable ngay sau khi g i yêu c u ử ầvào ra.

– Các hàm có th chuy n lu ng sang tr ng thái ể ể ồ ạ alertable: WSAWaitForMultipleEvents, SleepEx

– N u ng d ng không có đ i t ng event nào thì có th s d ng SleepExế ứ ụ ố ượ ể ử ụDWORD SleepEx(DWORD dwMilliseconds, // Th i gian đ iờ ợ

BOOL bAlertable // Tr ng thái alertableạ );

3.4 Các ph ng pháp vào raươ

158

• Các mô hình vào ra c a WinSockủ• Mô hình Overlapped – Thí d Completion Routineụ

// Khai báo các c u trúc c n thi tấ ầ ếSOCKET s;OVERLAPPED overlapped;char buff[1024];WSABUF databuff; DWORD flags;DWORD bytesReceived = 0;Int rc = 0;

void CALLBACK CompletionRoutine( IN DWORD dwError, IN DWORD cbTransferred, IN LPWSAOVERLAPPED lpOverlapped, IN DWORD dwFlags)

{if (dwError != 0||cbTransferred==0) // X lý l iử ỗ{

closesocket(s);return;

};

3.4 Các ph ng pháp vào raươ

159

• Các mô hình vào ra c a WinSockủ• Mô hình Overlapped – Thí d Completion Routineụ

// Hi n th xâu ra màn hìnhể ịbuff[cbTransferred]=0;printf(buff);// Kh i t o l i c u trúc overlapped và l i g i ti p yêu c u nh n d li uở ạ ạ ấ ạ ử ế ầ ậ ữ ệmemset(&overlapped,0,sizeof(overlapped));flags = 0;rc = WSARecv(s, &databuff, 1, &bytesReceived, &flags, &overlapped,

CompletionRoutine);if (rc == SOCKET_ERROR){

rc = WSAGetLastError();if (rc != WSA_IO_PENDING)

printf("Loi %d !\n",rc);};return;

}

3.4 Các ph ng pháp vào raươ

160

• Các mô hình vào ra c a WinSockủ• Mô hình Overlapped – Thí d Completion Routineụ

int _tmain(int argc, _TCHAR* argv[]){

// Kh i t o và k t n i đ n 127.0.0.1:8888ở ạ ế ố ế…// Kh i t o c u trúc overlappedở ạ ấmemset(&overlapped,0,sizeof(overlapped));// Kh i t o b đ m d li uở ạ ộ ệ ữ ệdatabuff.buf = buff;databuff.len = 1024;// G i yêu c u vào raử ầrc = WSARecv(s, &databuff,1,&bytesReceived,&flags,&overlapped,

CompletionRoutine);// X lý l i…ử ỗ// Chuy n lu ng sang tr ng thái alertableể ồ ạwhile (1) SleepEx(1000,TRUE);getch();closesocket(s);WSACleanup();return 0;

}

3.4 Các ph ng pháp vào raươ

161

• Bài t pậ– Vi t ch ng trình Server s d ng mô hình Overlapped – Completion ế ươ ử ụ

Routine có th nh n nhi u k t n i t client và chuy n ti p d li u ể ậ ề ế ố ừ ể ế ữ ệt m t client đ n các client còn l i.ừ ộ ế ạ

L ng Ánh Hoàngươ[email protected]

Ch ng 4. MFC Socketươ

• 4.1. Gi i thi uớ ệ• 4.2. CSocket• 4.3. CAsyncSocket

Ch ng 4. MFC Soketươ

163

• MFC: Microsoft Foundation Classes• B th vi n h ng đ i t ng C++ l p trình ng d ng trên ộ ư ệ ướ ố ượ ậ ứ ụ

Window.• Cung c p hai l p h tr l p trình m ngấ ớ ỗ ợ ậ ạ

– CAsyncSocket: Đóng gói l i th vi n WinSock d i d ng h ng ạ ư ệ ướ ạ ướđ i t ng. Ho t đ ng ch đ b t đ ng b .ố ượ ạ ộ ở ế ộ ấ ồ ộ

– CSocket: K th a t CAsyncSocket và cung c p giao di n m c ế ừ ừ ấ ệ ở ứcao h n n a. Ho t đ ng ch đ đ ng b .ơ ữ ạ ộ ở ế ộ ồ ộ

• Hai l p này không ớ thread-safe: đ i t ng t o ra lu ng ố ượ ạ ở ồnào thì ch có th đ c s d ng lu ng đó.ỉ ể ượ ử ụ ở ồ

• T p tiêu đ : afxsock.hệ ề

Ch ng 4.1 Gi i thi uươ ớ ệ

164

• Kh i t o th vi n: t đ ng b i framework qua hàm AfxSocketInitở ạ ư ệ ự ộ ở• Kh i t o đ i t ng CSocket: Ph ng th c Createở ạ ố ượ ươ ứ

Ch ng 4.2 CSocketươ

165

BOOL Create( UINT nSocketPort = 0, // C ng, m c đ nh là 0ổ ặ ị int nSocketType = SOCK_STREAM, // Ki u socketể LPCTSTR lpszSocketAddress = NULL) // Đ a ch giao di n m ng, thí dị ỉ ệ ạ ụ

// “192.168.1.1”Giá tr tr v : ị ả ề

- Khác NULL n u thành côngế- NULL n u th t b i. Mã l i có th truy nh p qua hàm GetLastError()ế ấ ạ ỗ ể ậ

Thí d :ụ

CSocket Server, Client Server.Create(8888);Client.Create();

• K t n i đ n máy khác: Ph ng th c Connectế ố ế ươ ứ

Ch ng 4.2 CSocketươ

166

BOOL Connect( LPCTSTR lpszHostAddress, // Đ a ch /tên mi n máy đíchị ỉ ề UINT nHostPort // C ngổ);BOOL Connect( const SOCKADDR* lpSockAddr, // Đ a ch máy đích d i d ng SOCKADDRị ỉ ướ ạ int nSockAddrLen // Chi u dài c u trúc đ a chề ấ ị ỉ);Giá tr tr v : ị ả ề

- Khác NULL n u thành côngế- NULL n u th t b i. Mã l i có th truy nh p qua hàm GetLastError()ế ấ ạ ỗ ể ậ

Thí d :ụ

CSocket s;s.Create();s.Connect(“www.google.com.vn”, 80);

• Đ i k t n i t máy khác: Ph ng th c Listenợ ế ố ừ ươ ứ

Ch ng 4.2 CSocketươ

167

BOOL Listen( int nConnectionBacklog = 5 )

Giá tr tr v : ị ả ề- Khác NULL n u thành côngế- NULL n u th t b i. Mã l i có th truy nh p qua hàm GetLastError()ế ấ ạ ỗ ể ậ

• Đóng k t n i: Ph ng th c Closeế ố ươ ứ

virtual void Close( )

• Ch p nh n k t n i t máy khác: Ph ng th c Acceptấ ậ ế ố ừ ươ ứ

Ch ng 4.2 CSocketươ

168

virtual BOOL Accept( CSocket& rConnectedSocket, // Socket t ng ng v i k t n i m iươ ứ ớ ế ố ớ SOCKADDR* lpSockAddr = NULL,// Đ a ch socket m i d i d ng SOCKADDRị ỉ ớ ướ ạ int* lpSockAddrLen = NULL // Chi u dài đ a ch ề ị ỉ);Giá tr tr v : ị ả ề

- Khác NULL n u thành côngế- NULL n u th t b i. Mã l i có th truy nh p qua hàm GetLastError()ế ấ ạ ỗ ể ậ

Thí d :ụ

CSocket Server, Client;// Kh i t o socket Serverở ạ…// Ch p nh n k t n iấ ậ ế ốServer.Accept(Client);// G i nh n d li u trên Clientử ậ ữ ệ…

• G i d li u đ n máy khác: Ph ng th c Sendử ữ ệ ế ươ ứ

Ch ng 4.2 CSocketươ

169

virtual int Send( const void* lpBuf, // B đ m ch a d li u c n g iộ ệ ứ ữ ệ ầ ử int nBufLen, // S byte c n g iố ầ ử int nFlags = 0 // C , ch có th là MSG_OOB n u cóờ ỉ ể ế);

Giá tr tr v : ị ả ề- S byte g i đ c n u thành côngố ử ượ ế- SOCKET_ERROR n u th t b iế ấ ạ

Thí d :ụ

char buff[]=“Hello MFC Socket”;Client.Send(buff,strlen(buff));

• Nh n d li u t máy khác: Ph ng th c Receiveậ ữ ệ ừ ươ ứ

Ch ng 4.2 CSocketươ

170

virtual int Receive( void* lpBuf, // B đ m sẽ nh n d li uộ ệ ậ ữ ệ int nBufLen, // Kích th c b đ mướ ộ ệ int nFlags = 0 // C , có th là MSG_PEEK ho c MSG_OOBờ ể ặ);

Giá tr tr v : ị ả ề- S byte nh n đ c n u thành côngố ậ ượ ế- NULL n u k t n i b đóngế ế ố ị- SOCKET_ERROR n u th t b iế ấ ạ

Thí d :ụ

…char buff[1024];int buflen = 1024, nBytesReceived;nBytesReceived = connectedSocket. Receive(buff,1024);…

Ch ng 4.2 CSocketươ

171

• Xây d ng Client b ng CSocketự ằ

…CSocket s;unsigned char buff[1024];char * request = “GET / HTTP/1.0\r\nHost:www.google.com\r\n\r\n”;int len = 0;s.Create();s.Connect(“www.google.com”,80);s.Send(request,strlen(request));len = s.Receive(buff,1024);buff[len] = 0;printf(“%s”,buff);…

Ch ng 4.2 CSocketươ

172

• Xây d ng Server b ng CSocketự ằ

…CSocket listen,connect;Char * buff = “Hello Network Programming”;listen.Create(80,SOCK_STREAM,”0.0.0.0”);listen.Listen();listen.Accept(connect);connect.Send(buff,strlen(buff));connect.Close();…

Ch ng 4.3 CAsyncSocketươ

173

• Đóng gói ho t đ ng c a socket b t đ ng bạ ộ ủ ấ ồ ộ• Nguyên m u các hàm vào ra t ng t CSocket nh ng tr v ngay l p ẫ ươ ự ư ở ề ậ

t c t l i g i.ứ ừ ờ ọ• ng d ng không s d ng tr c ti p l p này mà k th a và ch ng lên Ứ ụ ử ụ ự ế ớ ế ừ ồ

các ph ng th c o c a l p đ x lý các s ki n.ươ ứ ả ủ ớ ể ử ự ệ• Các ph ng th c hay đ c ch ngươ ứ ượ ồ

– OnAccept: Ph ng th c này sẽ đ c g i m i khi có yêu c u k t n i.ươ ứ ượ ọ ỗ ầ ế ố– OnClose: Ph ng th c này sẽ đ c g i m i khi socket đ u kia b đóng.ươ ứ ượ ọ ỗ ầ ị– OnSend: Ph ng th c này đ c g i khi socket có th g i d li u.ươ ứ ượ ọ ể ử ữ ệ– OnReceive: Ph ng th c này đ c g i khi socket nh n đ c d li u và ươ ứ ượ ọ ậ ượ ữ ệ

ch ng d ng x lýờ ứ ụ ử– OnConnect: Ph ng th c này đ c g i khi yêu c u k t n i đ c ch p ươ ứ ượ ọ ầ ế ố ượ ấ

nh n và socket đã s n sàng đ g i nh n d li u.ậ ẵ ể ử ậ ữ ệ

Ch ng 4.3 CAsyncSocketươ

174

• Kh i t o đ i t ng: Ph ng th c Createở ạ ố ượ ươ ứ

BOOL Create( UINT nSocketPort = 0, // C ngổ int nSocketType = SOCK_STREAM, // Ki u socketể long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,

// M t n s ki nặ ạ ự ệ LPCTSTR lpszSocketAddress = NULL // Đ a ch socketị ỉ);

Giá tr tr v :ị ả ề- Khác NULL n u thành côngế- NULL n u th t b iế ấ ạ

S khác bi t duy nh t v i CSocket ph ng th c này là tham s lEvent ch a m t n các s ự ệ ấ ớ ở ươ ứ ố ứ ặ ạ ựki n ng d ng mong mu n nh n đ cệ ứ ụ ố ậ ượ

Ch ng 4.3 CAsyncSocketươ

175

• X lý các s ki n: ch ng lên ph ng th c t ng ng v i s ki n mong ử ự ệ ồ ươ ứ ươ ứ ớ ự ệmu nố

void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket k th a tế ừ ừ // AsyncSocket{ static int i = 0; i++; TCHAR buff[4096]; int nRead; nRead = Receive(buff, 4096); switch (nRead) { case 0: Close(); break; case SOCKET_ERROR: if (GetLastError() != WSAEWOULDBLOCK) { AfxMessageBox (_T("Error occurred")); Close(); } break;

Ch ng 4.3 CAsyncSocketươ

176

• X lý các s ki n (ti p)ử ự ệ ế default: buff[nRead] = _T('\0'); // K t thúc xâuế CString szTemp(buff); m_strRecv += szTemp; // Chèn xâu nh n đ c vào cu i m_strRecvậ ượ ố if (szTemp.CompareNoCase(_T("bye")) == 0) { ShutDown(); s_eventDone.SetEvent(); } } CAsyncSocket::OnReceive(nErrorCode);}

Ch ng 4.3 CAsyncSocketươ

177

• 3.Vi t ch ng trình HTTP Streaming server th c hi n thao tác sau:ế ươ ự ệ– Đ i k t n i c ng 80ợ ế ố ở ổ– Cho phép gi i h n t c đ uploadớ ạ ố ộ– X lý các request t client g i đ n có d ngử ừ ử ế ạ

GET /<TenFile> HTTP/1.1Host:….\n\n

– Ph n h i các request nh sau:ả ồ ư• N u tên <TenFile> t n t i trong th m c hi n t i thì g i tr ph n h i có ế ồ ạ ư ụ ệ ạ ử ả ả ồ

d ngạ Status:OK-200\n

Content-Length:<KichThuocFile>\nContent-Type:video/mp4\n\n\n<NoiDungFile>

Ch ng 4.3 CAsyncSocketươ

178

• 3.Vi t ch ng trình HTTP Streaming server th c hi n thao ế ươ ự ệtác sau:– Ph n h i các request nh sau:ả ồ ư

• N u file không t n t i thì ph n h i l i nh sauế ồ ạ ả ồ ạ ưStatus: Not Found – 404\nContent-Length:<Chieu dai xau phan hoi>\nContent-Type:text/html\n\n\nKhông tìm th y t p tin ấ ệ

Ch ng 4.3 CAsyncSocketươ

179

• 1.Vi t ch ng trình g i file b ng CAsyncSocketế ươ ử ằ• 2. Vi t ch ng trình g i tin nh n mã hóa qua m ng b ng ế ươ ử ắ ạ ằ

blocking. Cách th c mã hóa nh sau:ứ ư– Server ch n m t s nguyên x (0-255) làm m t kh u. và ọ ộ ố ậ ẩ

g i cho m i client khi k t n i đ n. ử ỗ ế ố ế– Mã ASCII c a ký t đ c g i sẽ đ c c ng thêm x tr c ủ ự ượ ử ượ ộ ướ

khi truy n, bên nh n tr đi x đ hi n th . N u giá tr ề ậ ừ ể ể ị ế ịcông thêm >255 thì truy n đi ph n d c a giá tr đó khi ề ầ ư ủ ịchia cho 256.

L ng Ánh Hoàngươ[email protected]

Ch ng 5. NET Socketươ

• 5.1. Gi i thi uớ ệ• 5.2. TCP Server• 5.3. TCP Client• 5.4. UDP Server/Client

Ch ng 5. NET Soketươ

181

Ch ng 5.1 Gi i thi uươ ớ ệ

182

• .NET Framework là b th vi n ch y trên đa ki n trúc c a ộ ư ệ ạ ế ủMicrosoft

• Hai namespace h tr l p trình m ng: System.Net và ỗ ợ ậ ạSystem.Net.Sockets

• M t vài l p chínhộ ớ– IPAddress: L u tr và qu n lý đ a ch IP.ư ữ ả ị ỉ– IPEndPoint: L u tr thông tin v m t đ a ch socket, t ng t nh ư ữ ề ộ ị ỉ ươ ự ư

SOCKADDR_IN. Bao g m IPAddress và c ng.ồ ổ– DNS: H tr các thao tác phân gi i tên mi nỗ ợ ả ề– Socket: X lý các thao tác trên socketử

Ch ng 5.1 Gi i thi uươ ớ ệ

183

• IPAddress: Đóng gói m t đ a ch IPộ ị ỉ– Kh i t o: IPAddress.Parse(“192.168.1.1”);ở ạ– L y d ng chu i: IPAddress.ToString();ấ ạ ỗ– Các đ a ch đ c bi t: IPAddress.Any, IPAddress.Broadcast, ị ỉ ặ ệ

IPAddress.Loopback• IPEndPoint: Đóng gói m t đ a ch socketộ ị ỉ

– Kh i t o: IPEndPoint(IPAddress, Int32)ở ạ– L y d ng chu i: IPEndPoint.ToString();ấ ạ ỗ

• DNS: th c hi n phân gi i tên mi nự ệ ả ề– L y đ a ch IP: ấ ị ỉ

IPAddress[] DNS.GetHostAddress(“www.google.com”);– L y thông tin v host: ấ ề

IPHostEntry DNS.GetHostEntry(“www.google.com”);

Ch ng 5.2 TCP Serverươ

184

• Trình t t o TCP Serverự ạ– 1.T o m t Socketạ ộ– 2.Liên k t v i m t IPEndPoint c c bế ớ ộ ụ ộ– 3.L ng nghe k t n iắ ế ố– 4.Ch p nh n k t n iấ ậ ế ố– 5.G i nh n d li u theo giao th c ử ậ ữ ệ ứ đã thi t kế ế– 6.Đóng k t n i sau khi đã hoàn thành và tr l i tr ng thái l ng ế ố ở ạ ạ ắ

nghe ch k t n i m i.ờ ế ố ớ

Ch ng 5.2 TCP Serverươ

185

• Thí dụ // Thi t l p đ a ch c a serverế ậ ị ỉ ủ IPEndPoint ie = new IPEndPoint(IPAddress.Any, 8888); // T o socket serverạ Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); int ret; // Bind và Listen server.Bind(ie); server.Listen(10); Console.WriteLine(“Doi ket noi tu client..."); // Ch p nh n k t n i m iấ ậ ế ố ớ Socket client = server.Accept(); Console.WriteLine("Chap nhan ket noi tu:{0}", client.RemoteEndPoint.ToString()); string s = “Hello Net Socket"; byte[] data = new byte[1024]; data = Encoding.ASCII.GetBytes(s); client.Send(data, data.Length, SocketFlags.None);

Ch ng 5.2 TCP Serverươ

186

• Thí d (ti p)ụ ếwhile (true) { data = new byte[1024]; ret = client.Receive(data); if (ret == 0) break; Console.WriteLine("Du lieu tu client:{0}", Encoding.ASCII.GetString(data,0,ret)); } client.Shutdown(SocketShutdown.Both); client.Close();

Ch ng 5.3 TCP Clientươ

187

• Trình tự– Xác đ nh đ a ch c a Serverị ị ỉ ủ– T o Socketạ– K t n i đ n Serverế ố ế– G i nh n d li u theo giao th c đã thi t kử ậ ữ ệ ứ ế ế– Đóng Socket

Ch ng 5.3 TCP Clientươ

188

• Thí dụ// Thi t l p đ a chế ậ ị ỉIPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888);// T o socket clientạSocket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// K t n i đ n serverế ố ếclient.Connect(iep);byte[] data = new byte[1024];int recv = client.Receive(data); // Nh n câu chào t serverậ ừstring s = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("Server gui:{0}", s);string input;while (true) { input = Console.ReadLine(); //Chuyen input thanh mang byte gui len cho server data = Encoding.ASCII.GetBytes(input); client.Send(data, data.Length, SocketFlags.None);

Ch ng 5.3 TCP Clientươ

189

• Thí d (ti p)ụ ế if (input.ToUpper().Equals("QUIT")) break;} client.Disconnect(true); client.Close();}

Ch ng 5.4 UDP Server/Clientươ

190

• Trình t UDP Serverự– T o m t Socketạ ộ– Liên k t v i m t IPEndPoint c c b qua hàm Bind (UDP Server) ế ớ ộ ụ ộ

ho c xác đ nh đ a ch Server đ g i d li u (UDP Client)ặ ị ị ỉ ể ử ữ ệ– G i nh n d li u theo giao th c đã thi t k b ng hàm ử ậ ữ ệ ứ ế ế ằ

ReceiveFrom/SendTo– Đóng Socket

191

• Thi cu i kỳ: 70%ố• Chuyên c n: 15%ầ• Gi a kỳ: 15%ữ

Phân ph i đi mố ể

192

• T t c các ch ngấ ả ươ

N i dungộ

193

• Tr c nghi mắ ệ• Th i gian: 60pờ• S câu h i: 40ố ỏ• C lý thuy t + bài t pả ế ậ• Không s d ng tài li uử ụ ệ• [email protected]

Hình th c thiứ

194

• Bài t p đã nh nậ ậ• Thành viên và phân chia công vi cệ• Các tài li u sẽ đ c (tham kh o)ệ ọ ả• C u trúc (block diagram, s đ kh i) ch ng trìnhấ ở ồ ố ươ• Phác th o giao di n ả ệ• Làm th nào đ trình di n ch ng trìnhế ể ễ ươ• Mã ngu n tham kh oồ ả