Lập trình socket với TCP

You might also like

Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 31

Network Programming

Lұp trình socket vӟi TCP


stream socket
Đӛ Thanh Thӫy
thuydt02@yahoo.com
Nӝi dung
‡ Khái niӋm Socket
‡ Các loҥi socket
‡ Quy trình tҥo mӝt ӭng dөng gӱi yêu cҫu
và nhұn dӳ liӋu giӳa client và server
‡ Giӟi thiӋu mӝt sӕ lӟp trong C#: Dns,
IPAddress, IPHostEntry, IPEndPoint, «
‡ Các ví dө minh hӑa
Socket
‡ Là giao diӋn nҵm trên máy tính
‡ Do ӭng dөng tҥo ra và quҧn lý nhưng hӋ
điӅu hành kiӇm soát
‡ Là ³cӱa´ mà thông qua đó, tiӃn trình gӱi
và nhұn thông điӋp tӯ các tiӃn trình ӭng
dөng khác (ӣ máy tính khác)
‡ Trong C#. Socket API đưӧc cài đһt trong
namespace System.Net.Sockets.
Socket
Các loҥi socket
Quy trình «
‡ Tҥi server
± TiӃn trình phөc vө (server process - sp) đưӧc
tҥo ra và cho chҥy tҥi mӝt port nhҩt đӏnh
± sp luôn chҩp nhұn kӃt nӕi và lҳng nghe các
yêu cҫu tӯ các client bҵng cách xӃp các yêu
cҫu vào hàng đӧi
± Khi server chҩp nhұn kӃt nӕi tӯ 1 client -> tҥo
mӝt socket mӟi đӇ giao tiӃp (nhұn yêu cҫu)
vӟi client đó.
± Đóng socket.
Quy trình «
‡ Client:
± Khӣi tҥo 1 TCP socket tҥi local
± KӃt nӕi đӃn tiӃn trình tҥi server (server
process - sp) bҵng đӏa chӍ IP cӫa server và
Port cӫa sp đang chҥy trên đó.
± Gӱi thông điӋp yêu cҫu tӟi server
± Nhұn lҥi thông điӋp trҧ lӡi cӫa server
± Đóng socket
Quy trình ...
Server Client

socket() socket()
bind()
listen()
accept() connect()
recv() send()
send() recv()
close() close()
Quy trình «
Chú ý
‡ Khuôn dҥng thông điӋp yêu cҫu (client) và
thông điӋp trҧ lӡi (server) cҫn phҧi đưӧc
quy đӏnh trưӟc
‡ Ngưӡi lұp trình application protocol phҧi
đӏnh nghĩa các protocol trưӟc khi cài đһt
chúng.
Các namespace cho lұp trình mҥng
‡ System.Net.Sockets;
‡ System.Net;
-> các lӟp hӛ trӧ lұp trình mҥng thuӝc 2
namespace này
-> cҫn using chúng vào project
Dns class
‡ Thuӝc namespace System.Net
‡ Phân giҧi đӏa chӍ tên miӅn -> đӏa chӍ IP
‡ Các phương thӭc quan trӑng:
public static IPHostEntry Resolve(string hostname)
Phân giҧi đӏa chӍ tên miӅn -> IPHostEntry (chӭa mӝt tұp đӏa chӍ IP)
Ví dө:
IPHostEntry iph = Dns.Resolve(www.msdn.microsoft.com);
à iph.HostName = msdn.micosoft.akadns.net
à iph.AddressList = {64.4.11.251}
à iph.Aliases = {msdn.microsoft.com}
Chú ý: Có thӇ kiӇm tra bҵng lӋnh nslookup msdn.micosoft.com cӫa
windows (bҩt kǤ phiên bҧn nào) đӇ so sánh kӃt quҧ
Dns class

IPAddess[] GetHostAddresses(string
HostnameOrAddress)
Trҧ vӅ mӝt tұp các đӏa chӍ IP (IPAddress[]) cӫa
hostname
Ví dө:
IPAddress[] ips;
ips = Dns.GetHostAddresses(³microsoft.com´);
àips = {207.46.232.182, 207.46.197.32}
Chú ý: có thӇ dùng nslookup đӇ kiӇm tra
Dns class
string GetHostName()
Xác đӏnh Hostname cӫa máy mà tiӃn trình thi hành hàm
này đang chҥy trên đó (local computer)
Ví dө:
string mycomputername = Dns.GetHostName();
=> mycomputername = sz650nc
Dns class
IPHostEntry GetHostByName (string hostname)
Phương thӭc này thi hành mӝt truy vҩn DNS (dns query)
đӕi vӟi hostname vӟi DNS server đã đưӧc cҩu hình
trong hӋ thӕng. KӃt quҧ trҧ vӅ gӗm:
± AddressList: mӝt mҧng các đӏa chӍ IP (mӝt hostname có thӇ gҳn
vӟi nhiӅu đӏa chӍ IP)
± Aliases: mӝt mҧng các bí danh
± Hostname: tên miӅn cӫa hostname.
Ví dө:
IPHostEntry iph = Dns.GetHostByName(³www.msdn.microsoft.com´);
à iph.HostName = msdn.micosoft.akadns.net
à iph.AddressList = {64.4.11.251}
à iph.Aliases = {msdn.microsoft.com}
Dns class
IPHostEntry GetHostByAddress(string address)
IPHostEntry GetHostByAddress(IPAddress address)
Trҧ vӅ thông tin (hostname, aliases, ip addresses) cӫa hostname khi
đã biӃt IP hoһc tên miӅn cӫa host.
Ví dө:
IPAddress ip = IPAddress.Parse(³64.4.11.251´);
IPHostEntry iph = Dns.GetHostByAddress(ip);
à iph.HostName = msdn.micosoft.akadns.net
à iph.AddressList = {64.4.11.251}
à iph.Aliases = {msdn.microsoft.com}
Chú ý: GetHostByAddress() không phҧi lúc nào cũng thi
hành đưӧc. Đӏa chӍ IP ko phҧi luc nào cũng phân giҧi
đưӧc -> host name.
IPAddress Class
‡ Thuӝc namespace System.Net
‡ ThӇ hiӋn đӏa chӍ IP
‡ Các phương thӭc cơ bҧn
Boolean Equals(Object ip)
‡ Trҧ vӅ TRUE nӃu hai đӏa chӍ ip giӕng nhau, FALSE trong các
trưӡng hӧp còn lҥi
‡ Ví dө:
IPAddress ip1 = IPAddress.Parse("210.245.86.184");
IPAddress ip2 = IPAddress.Parse("210.245.86.184");
Boolean kq = ip1.Equals(ip2);
=> kq = true
IPAddress class
IPAddress Parse(string ip)
ChuyӇn mӝt đӏa chӍ ip trong khuôn dҥng
xâu ký tӵ -> IPAddress
ví dө:
IPAddress myip =
IPAddress.Parse("210.245.86.184");
IPAddress class
‡ string toString()
‡ Trҧ vӅ xâu ký tӵ thӇ hiӋn đӏa chӍ IP
‡ Ví dө:
IPAddress ip1 =
IPAddress.Parse("210.245.86.184");
=> ip1.toString() = "210.245.86.184"
IPAddress class
Boolean IsLoopBack (IPAddress ip)
Trҧ vӅ true nӃu ip là mӝt đӏa chӍ loopback
cӫa hӋ thӕng, false trong các trưӡng hӧp
còn lҥi
ví dө:
IPAddress ip1 = IPAddress.Parse("210.245.86.184");
Boolean loopback = IPAddress.IsLoopback(ip1);
à Loopback = false
IPAddress class
IPAddress Any
Cung cҩp đӏa chӍ IP chӍ đӏnh cho server
phҧi lҳng nghe hành đӝng cӫa client trên
tҩt cҧ các interface.
ví dө:
IPAddress anyIP = IPAddress.Any;
=> anyIP.toString() = 0.0.0.0
IPAddress class
IPAddress Broadcast
Đӏa chӍ broadcast trong mҥng LAN
Ví dө:
IPAddress bIP = IPAddress.Broadcast;
=> bIP.toString() = 255.255.255.255
IPAddress class
IPAddress Loopback
Đӏa chӍ loopback cӫa hӋ thӕng
Ví dө:
string lip = IPAddress.Loopback.ToString();
=> lip = 127.0.0.1
IPAddress class
IPAddress None
ThӇ hiӋn hӋ thӕng không có network
interface.
ví dө:
string nip = IPAddress.None.ToString();
=> nip = 255.255.255.255
IPEndPoint class
‡ Thuӝc namespace System.Net
‡ ThӇ hiӋn mӝt network endpoint bao gӗm
IP address + port.
‡ Sӱ dөng đӇ kӃt gán socket vӟi mӝt đӏa chӍ
ip trên hӋ thӕng và connect đӃn mӝt
server
‡ Các phương thӭc cơ bҧn:
IPEndPoint class
IPEndPoint IPEndPoint(IPAddress ip, int p)
Hàm tҥo
ví dө:
IPAddress ip = IPAddress.Parse(³127.0.0.1´);
IPEndPoint ipep = new IPEndPoint(ip, 9090);
=> t̹o mͱt IPEndPoint t̹i máy local, cͭng là
9090.
IPEndPoint class
‡ Thuӝc tính
IPAddress Address { get; set; }
ví dө:
IPAddress ip = IPAddress.Parse(³127.0.0.1´);
IPEndPoint ipep = new IPEndPoint(ip, 9090);
=> ipep.Address = 127.0.0.1
int Port { get; set; }
ví dө: như trên
=> ipep.Port = 9090
IPEndPoint class
AddressFamily AddressFamily { get; }
Trҧ vӅ kiӇu đӏa chӍ cӫa socket (ipv4, ipx,
spx, ...)
ví dө:
IPAddress ip = IPAddress.Parse(³127.0.0.1´);
IPEndPoint ipep = new IPEndPoint(ip, 9090);
=> ipep.AddressFamily = Internetwork (ipv4)
IPEndPoint class
‡ int MaxPort
‡ int MinPort
‡ Ví dө
IPAddress ip =
IPAddress.Parse(³192.168.1.1´);
IPEndPoint ipep = new IPEndPoint(ip,80);
=>ipep.MinPort = 0
=>ipep.MaxPort = 65535
IPHostEntry class
‡ Thuӝc namespace System.net
‡ Lӟp này chӭa thông tin vӅ các đӏa chӍ host
‡ Các thuӝc tính:
IPAddress[] AddressList { get; set; }
ThӇ hiӋn các đӏa chӍ IP cӫa host
string[] Aliases { get; set; }
ThӇ hiӋn các Aliases cӫa host
string HostName { get; set; }
ThӇ hiӋn tên miӅn cӫa host

You might also like