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 = "";
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 {
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();
}
}
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ó.
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:
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
1.3 “Ping” một địa chỉ IP
V
VBạ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ể
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);
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.)
}
}
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() {
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";
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) {
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.");
}