lập trình socket với tcp

Post on 07-Apr-2015

618 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

Đỗ Thanh Thủy

thuydt02@yahoo.com

Network Programming

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

top related