448
Chương 11: Lập trình mạng
7.
7.
“Ping” m t đ a ch IP
ộ ị
ỉ
“Ping” m t đ a ch IP
ộ ị
ỉ
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 =
new IPEndPoint(serverHE.AddressList[0], 0);
EndPoint epServer = (ipepServer);