1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Lập trình Mạng Microsoft .NET Framework phần 2 ppt

10 409 2
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tài liệu Lập trình Mạng Microsoft .NET Framework phần 2 ppt
Định dạng
Số trang 10
Dung lượng 168,29 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

V Bạn cần lấy địa chỉ IP của máy tính hiện hành, có thể là để sử dụng sau này trong mã lệnh networking.. Một thông điệp “ping” giao tiếp với một thiết bị tại một địa chỉ IP cụ thể, gửi

Trang 1

using System;

using System.Drawing;

using System.Windows.Forms;

public class WebBrowser : System.Windows.Forms.Form {

private AxSHDocVw.AxWebBrowser explorer;

private System.Windows.Forms.Button cmdBack;

private System.Windows.Forms.Button cmdHome;

private System.Windows.Forms.Button cmdForward;

// (Bỏ qua phần mã designer.)

private void WebBrowser_Load(object sender, System.EventArgs e) {

object nullObject = null;

object uri = "http://www.dvpub.com.vn";

explorer.Navigate2(ref uri, ref nullObject, ref nullObject,

ref nullObject, ref nullObject);

}

private void cmdHome_Click(object sender, System.EventArgs e) {

explorer.GoHome();

}

private void cmdForward_Click(object sender, System.EventArgs e) {

try {

explorer.GoForward();

} catch {

MessageBox.Show("Already on last page.");

}

}

private void cmdBack_Click(object sender, System.EventArgs e) { try {

explorer.GoBack();

Trang 2

} catch {

MessageBox.Show("Already on first page.");

}

}

}

Hầu hết các phương thức của điều kiểm Web Browser đều yêu cầu một vài thông số Vì các phương thức này không được nạp chồng, và vì C# không hỗ trợ tham số tùy chọn,

nên bạn phải cung cấp giá trị cho mọi tham số Bạn không thể sử dụng tham chiếu null được, vì chúng là các thông số ref Thay vào đó, bạn hãy tạo ra một biến đối tượng chứa tham chiếu null, sau đó cung cấp nó cho các thông số mà bạn không cần sử dụng Kỹ thuật này sẽ được mô tả chi tiết trong mục 15.8

V Bạn cần lấy địa chỉ IP của máy tính hiện hành, có thể là để sử dụng sau này

trong mã lệnh networking

# Sử dụng phương thức GetHostName và GetHostByName của lớp System.Net.Dns

Lớp Dns cung cấp các dịch vụ phân giải tên miền Bạn có thể gọi phương thức GetHostName để lấy về tên host của máy tính hiện hành Sau đó, bạn có thể dịch tên này

sang địa chỉ IP bằng phương thức GetHostByName Đây là một ví dụ:

using System;

using System.Net;

public class GetIPAddress {

private static void Main() {

// Lấy tên host của máy tính hiện hành

string hostName = Dns.GetHostName();

// Lấy địa chỉ IP trùng khớp đầu tiên

string ipAddress =

Dns.GetHostByName(hostName).AddressList[0].ToString();

Console.WriteLine("Host name: " + hostName);

Console.WriteLine("IP address: " + ipAddress);

Console.ReadLine();

Trang 3

}

}

Phương thức GetHostByName trả về danh sách các địa chỉ IP có hiệu lực Trong rất

nhiều trường hợp, danh sách này chỉ có một phần tử

# Khi sử dụng địa chỉ IP trong giao tiếp mạng, bạn có thể sử dụng địa chỉ 127.0.0.1 để chỉ đến máy tính hiện hành thay cho địa chỉ IP thực tế của nó

V Bạn muốn xác định địa chỉ IP của một máy tính dựa vào tên miền của nó bằng cách thực hiện một truy vấn Domain Name System (DNS)

# Sử dụng phương thức GetHostByName của lớp System.Net.Dns với đối số là tên miền

Trên web, các địa chỉ IP có thể truy xuất công khai thường được ánh xạ đến tên miền để

dễ nhớ hơn Ví dụ, địa chỉ 207.171.185.16 được ánh xạ đến tên miền www.amazon.com

Để xác định địa chỉ IP khi có tên miền, máy tính cần liên lạc với một DNS-server

Quá trình phân giải tên miền được thực hiện một cách trong suốt khi bạn sử dụng lớp

System.Net.Dns Lớp này cho phép lấy địa chỉ IP của một tên miền bằng phương thức GetHostByName Dưới đây là đoạn mã trình bày cách lấy danh sách các địa chỉ IP được ánh xạ đến tên miền www.microsoft.com

using System;

using System.Net;

public class ResolveIP {

private static void Main() {

foreach (IPAddress ip in

Dns.GetHostByName("www.microsoft.com").AddressList) {

Console.Write(ip.AddressFamily.ToString() + ": ");

Console.WriteLine(ip.ToString());

}

Console.ReadLine();

}

}

Khi chạy đoạn mã trên, bạn sẽ thấy kết xuất như sau:

Trang 4

InterNetwork: 207.46.249.222

InterNetwork: 207.46.134.222

InterNetwork: 207.46.249.27

InterNetwork: 207.46.134.155

InterNetwork: 207.46.249.190

V Bạn muốn kiểm tra một máy tính có online hay không và đo thời gian đáp ứng

(response time) của nó

# Gửi một thông điệp “ping” Thông điệp này được gửi bằng giao thức Internet

Control Message Protocol (ICMP) với một raw-socket

Một thông điệp “ping” giao tiếp với một thiết bị tại một địa chỉ IP cụ thể, gửi một thông

điệp thử nghiệm, và yêu cầu thiết bị này đáp ứng lại Để đo thời gian kết nối giữa hai máy

tính, bạn có thể đo thời gian cho một đáp ứng

Mặc dù thông điệp “ping” đơn giản hơn các kiểu giao tiếp khác, nhưng hiện thực một tiện

ích “ping” trong NET đòi hỏi một lượng lớn mã lệnh networking mức-thấp và phức tạp

Thư viện lớp NET không có sẵn giải pháp nào—thay vào đó, bạn phải sử dụng

raw-socket và một số mã lệnh cực kỳ dài

Tuy nhiên, đã có ít nhất một nhà phát triển giải quyết được vấn đề “ping” Dưới đây là

mã lệnh do Lance Olson, một nhà phát triển của Microsoft, cung cấp Mã lệnh này cho

phép “ping” một host bằng tên hay địa chỉ IP và đo lượng mili-giây cho một đáp ứng

using System;

using System.Net;

using System.Net.Sockets;

public class Pinger {

public static int GetPingTime(string host) {

int dwStart = 0, dwStop = 0;

// Tạo một raw-socket

Socket socket = new Socket(AddressFamily.InterNetwork,

SocketType.Raw, ProtocolType.Icmp);

// Lấy IPEndPoint của server, và chuyển nó thành EndPoint

IPHostEntry serverHE = Dns.GetHostByName(host);

IPEndPoint ipepServer =

Trang 5

new IPEndPoint(serverHE.AddressList[0], 0);

EndPoint epServer = (ipepServer);

// Thiết lập endpoint cho máy client

IPHostEntry fromHE = Dns.GetHostByName(Dns.GetHostName()); IPEndPoint ipEndPointFrom =

new IPEndPoint(fromHE.AddressList[0], 0);

EndPoint EndPointFrom = (ipEndPointFrom);

// Tạo packet

int PacketSize = 0;

IcmpPacket packet = new IcmpPacket();

for (int j = 0; j < 1; j++) {

packet.Type = ICMP_ECHO;

packet.SubCode = 0;

packet.CheckSum = UInt16.Parse("0");

packet.Identifier = UInt16.Parse("45");

packet.SequenceNumber = UInt16.Parse("0");

int PingData = 32;

packet.Data = new Byte[PingData];

for (int i = 0; i < PingData; i++)

packet.Data[i] = (byte)'#';

PacketSize = PingData + 8;

Byte [] icmp_pkt_buffer = new Byte [PacketSize];

int index = 0;

index = Serialize(packet,

icmp_pkt_buffer, PacketSize, PingData);

// Tính checksum cho packet

double double_length = Convert.ToDouble(index);

double dtemp = Math.Ceiling(double_length / 2);

int cksum_buffer_length = Convert.ToInt32(dtemp);

UInt16[] cksum_buffer = new UInt16[cksum_buffer_length]; int icmp_header_buffer_index = 0;

Trang 6

for (int i = 0; i < cksum_buffer_length; i++) {

cksum_buffer[i] = BitConverter.ToUInt16(icmp_pkt_buffer, icmp_header_buffer_index);

icmp_header_buffer_index += 2;

}

UInt16 u_cksum = checksum(cksum_buffer, cksum_buffer_length); packet.CheckSum = u_cksum;

// Tuần tự hóa packet

byte[] sendbuf = new byte[PacketSize];

index = Serialize(packet, sendbuf, PacketSize, PingData);

// Bắt đầu tính giờ

dwStart = System.Environment.TickCount;

socket.SendTo(sendbuf, PacketSize, 0, epServer);

// Nhận đáp ứng, và ngừng tính giờ

byte[] ReceiveBuffer = new byte[256];

socket.ReceiveFrom(ReceiveBuffer, 256, 0, ref EndPointFrom); dwStop = System.Environment.TickCount - dwStart;

}

// Dọn dẹp và trả về thời gian "ping" (tính theo giây)

socket.Close();

return (int)dwStop;

}

private static int Serialize(IcmpPacket packet, byte[] buffer,

int packetSize, int pingData) {

// (Bỏ qua phương thức private dùng để tuần tự hóa packet.)

}

private static UInt16 checksum(UInt16[] buffer, int size) {

// (Bỏ qua phương thức private dùng để tính checksum.)

}

}

Trang 7

public class IcmpPacket {

public byte Type;

public byte SubCode;

public UInt16 CheckSum;

public UInt16 Identifier;

public UInt16 SequenceNumber;

public byte[] Data;

}

Bạn có thể sử dụng phương thức tĩnh Pinger.GetPingTime với một địa chỉ IP hay một tên

miền Phương thức GetPingTime trả về lượng mili-giây trôi qua trước khi một đáp ứng

được tiếp nhận Dưới đây là đoạn mã thử nghiệm trên ba website:

public class PingTest {

private static void Main() {

Console.WriteLine("Milliseconds to contact www.yahoo.com:" +

Pinger.GetPingTime("www.yahoo.com").ToString());

Console.WriteLine("Milliseconds to contact www.seti.org:" +

Pinger.GetPingTime("www.seti.org").ToString());

Console.WriteLine("Milliseconds to contact the local computer:" +

Pinger.GetPingTime("127.0.0.1").ToString());

Console.ReadLine();

}

}

Thử nghiệm “ping” cho phép bạn xác minh các máy tính khác có online hay không Nó

cũng có thể hữu ích khi ứng dụng của bạn cần đánh giá những máy tính khác nhau (ở xa)

nhưng cho cùng nội dung để xác định máy nào có thời gian giao tiếp mạng thấp nhất

# Một yêu cầu “ping” có thể không thành công nếu bị firewall ngăn lại Ví dụ,

nhiều site bỏ qua yêu cầu “ping” vì sợ bị sa vào một luồng “ping” cùng một lúc

sẽ làm cản trở server (thực chất là một tấn công từ chối dịch vụ)

V Bạn cần gửi dữ liệu giữa hai máy tính trên một network bằng kết nối TCP/IP

System.Net.Sockets.TcpListener Mỗi khi một kết nối được thiết lập, cả hai

máy tính đều có thể giao tiếp bằng lớp System.Net.Sockets.TcpListener

Trang 8

TCP là một giao thức đáng tin cậy dựa-trên-kết-nối, cho phép hai máy tính giao tiếp thông qua một network Để tạo một kết nối TCP, một máy tính phải đóng vai trò là server

và bắt đầu lắng nghe trên một endpoint cụ thể (endpoint được định nghĩa là một địa chỉ

IP, cho biết máy tính và số port) Một máy tính khác phải đóng vai trò là client và gửi

một yêu cầu kết nối đến endpoint mà máy tính thứ nhất đang lắng nghe trên đó Một khi kết nối được thiết lập, hai máy tính có thể trao đổi các thông điệp với nhau Cả hai máy tính chỉ đơn giản đọc/ghi từ một System.Net.Sockets.NetworkStream

# Mặc dù một kết nối TCP luôn cần có một server và một client, nhưng không lý

do gì một ứng dụng không thể là cả hai Ví dụ, trong một ứng dụng

peer-to-peer, một tiểu trình được sử dụng lắng nghe các yêu cầu đến (đóng vai trò là

một server) trong khi một tiểu trình khác được sử dụng để khởi tạo các kết nối

đi (đóng vai trò là một client) Trong ví dụ đi kèm mục này, client và server là các ứng dụng riêng rẽ và được đặt trong các thư mục con riêng

Một khi kết nối TCP được thiết lập, hai máy tính có thể gửi bất kỳ kiểu dữ liệu nào bằng

cách ghi dữ liệu đó ra NetworkStream Tuy nhiên, ý tưởng hay là bắt đầu thiết kế một ứng dụng mạng bằng cách định nghĩa giao thức mức-ứng-dụng mà client và server sẽ sử dụng để giao tiếp Giao thức này chứa các hằng mô tả các lệnh được phép, bảo đảm mã lệnh của ứng dụng không chứa các chuỗi giao tiếp được viết cứng

namespace SharedComponent {

public class ServerMessages {

public const string AcknowledgeOK = "OK";

public const string AcknowledgeCancel = "Cancel";

public const string Disconnect = "Bye";

}

public class ClientMessages {

public const string RequestConnect = "Hello";

public const string Disconnect = "Bye";

}

}

Trong ví dụ này, bảng từ vựng được định nghĩa sẵn chỉ là cơ bản Bạn có thể thêm nhiều hằng hơn nữa tùy thuộc vào kiểu ứng dụng Ví dụ, trong một ứng dụng truyền file, client

có thể gửi một thông điệp để yêu cầu một file Sau đó, server có thể đáp lại bằng một

acknowledgment (ACK) và trả về các chi tiết của file (kích thước file chẳng hạn) Những hằng này sẽ được biên dịch thành một Class Library Assembly riêng, và cả client và

server đều phải tham chiếu đến assembly này

Trang 9

Đoạn mã dưới đây là một khuôn dạng cho một TCP-server cơ bản Nó lắng nghe trên một

port cố định, nhận kết nối đến đầu tiên và rồi đợi client yêu cầu ngừng kết nối Tại thời điểm này, server có thể gọi phương thức TcpListener.AcceptTcpClient lần nữa để đợi client kế tiếp Nhưng thay vào đó, nó sẽ đóng lại

using System;

using System.Net;

using System.Net.Sockets;

using System.IO;

using SharedComponent;

public class TcpServerTest {

private static void Main() {

// Tạo listener trên port 8000

TcpListener listener =

new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);

Console.WriteLine("About to initialize port.");

listener.Start();

Console.WriteLine("Listening for a connection ");

try {

// Đợi yêu cầu kết nối, và trả về TcpClient

TcpClient client = listener.AcceptTcpClient();

Console.WriteLine("Connection accepted.");

// Thu lấy network stream

NetworkStream stream = client.GetStream();

// Tạo BinaryWriter để ghi ra stream

BinaryWriter w = new BinaryWriter(stream);

// Tạo BinaryReader để đọc từ stream

BinaryReader r = new BinaryReader(stream);

if (r.ReadString() == ClientMessages.RequestConnect) {

Trang 10

w.Write(ServerMessages.AcknowledgeOK);

Console.WriteLine("Connection completed.");

while (r.ReadString() != ClientMessages.Disconnect) {}

Console.WriteLine();

Console.WriteLine("Disconnect request received."); w.Write(ServerMessages.Disconnect);

} else {

Console.WriteLine("Could not complete connection."); }

// Đóng socket

client.Close();

Console.WriteLine("Connection closed.");

// Đóng socket nằm dưới (ngừng lắng nghe yêu cầu mới) listener.Stop();

Console.WriteLine("Listener stopped.");

} catch (Exception err) {

Console.WriteLine(err.ToString());

}

Console.ReadLine();

}

}

Ngày đăng: 26/01/2014, 04:20

TỪ KHÓA LIÊN QUAN

w