Download - Lập trình socket với TCP
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()
bind()
listen()
accept()
recv()
send()
close()
socket()
connect()
send()
recv()
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 classIPHostEntry 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ínhIPAddress 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 hoststring[] Aliases { get; set; }Thể hiện các Aliases của hoststring HostName { get; set; }Thể hiện tên miền của host