lập trình socket với tcp

31
Lập trình socket với TCP stream socket Đỗ Thanh Thủy [email protected] Network Programming

Upload: chipbomb

Post on 07-Apr-2015

617 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Lập trình socket với TCP

Lập trình socket với TCPstream socket

Đỗ Thanh Thủy

[email protected]

Network Programming

Page 2: 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

Page 3: Lập trình socket với TCP

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.

Page 4: Lập trình socket với TCP

Socket

Page 5: Lập trình socket với TCP

Các loại socket

Page 6: Lập trình socket với TCP

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.

Page 7: Lập trình socket với TCP

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

Page 8: Lập trình socket với TCP

Quy trình ...

Server Client

socket()

bind()

listen()

accept()

recv()

send()

close()

socket()

connect()

send()

recv()

close()

Page 9: Lập trình socket với TCP

Quy trình …

Page 10: Lập trình socket với TCP

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.

Page 11: Lập trình socket với TCP

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

Page 12: Lập trình socket với TCP

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ả

Page 13: Lập trình socket với TCP

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

Page 14: Lập trình socket với TCP

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

Page 15: Lập trình socket với TCP

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}

Page 16: Lập trình socket với TCP

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.

Page 17: Lập trình socket với TCP

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

Page 18: Lập trình socket với TCP

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");

Page 19: Lập trình socket với TCP

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"

Page 20: Lập trình socket với TCP

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

Page 21: Lập trình socket với TCP

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

Page 22: Lập trình socket với TCP

IPAddress class

IPAddress Broadcast

Địa chỉ broadcast trong mạng LAN

Ví dụ:

IPAddress bIP = IPAddress.Broadcast;

=> bIP.toString() = 255.255.255.255

Page 23: Lập trình socket với TCP

IPAddress class

IPAddress Loopback

Địa chỉ loopback của hệ thống

Ví dụ:

string lip = IPAddress.Loopback.ToString();

=> lip = 127.0.0.1

Page 24: Lập trình socket với TCP

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

Page 25: Lập trình socket với TCP

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:

Page 26: Lập trình socket với TCP

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.

Page 27: Lập trình socket với TCP

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

Page 28: Lập trình socket với TCP

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)

Page 29: Lập trình socket với TCP

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

Page 30: Lập trình socket với TCP

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

Page 31: Lập trình socket với TCP