Εφαρμογή PING χωρίς χρήση ακατέργαστων υποδοχών

Windows υποστηρίζει ένα πρωτόκολλο μηνυμάτων ελέγχου Internet (ICMP) για να καθορίσει εάν υπάρχει ή όχι συγκεκριμένος κεντρικός υπολογιστής. Το ICMP είναι ένα πρωτόκολλο στρώματος δικτύου που παρέχει έλεγχο ροής, μηνύματα σφάλματος, δρομολόγηση και άλλα δεδομένα μεταξύ κεντρικών υπολογιστών του Διαδικτύου. Το ICMP χρησιμοποιείται κυρίως από προγραμματιστές εφαρμογών για ping δικτύου.

Τι είναι το Ping;

Ένα ping είναι η διαδικασία αποστολής μηνύματος ηχώ σε μια διεύθυνση IP και ανάγνωση της απάντησης για επαλήθευση σύνδεσης Κεντρικούς υπολογιστές TCP / IP. Αν γράφετε μια νέα εφαρμογή, θα είναι καλύτερα να χρησιμοποιήσετε την υποστήριξη των πρώτων sockets Winsock 2, την οποία εφαρμόζετε Indy, για παράδειγμα.

Σημειώστε, ωστόσο, ότι για τις υλοποιήσεις των Windows NT και των Windows 2000, τα Raw Sockets υπόκεινται σε ελέγχους ασφαλείας και είναι προσβάσιμα μόνο σε μέλη της ομάδας του διαχειριστή. Το Icmp.dll παρέχει λειτουργικότητα που επιτρέπει στους προγραμματιστές να γράφουν εφαρμογές ping στο Internet σε συστήματα Windows χωρίς υποστήριξη Winsock 2.

instagram viewer

Σημειώστε ότι η λειτουργία Winsock 1.1 WSAStartup πρέπει να κληθεί πριν από τη χρήση των λειτουργιών που εκτίθενται από το ICMP.DLL. Αν δεν το κάνετε αυτό, η πρώτη κλήση στο IcmpSendEcho θα αποτύχει με το σφάλμα 10091 (WSASYSNOTREADY).

Παρακάτω μπορείτε να βρείτε τον πηγαίο κώδικα της μονάδας Ping. Ακολουθούν δύο παραδείγματα χρήσης.

Παράδειγμα 1: Απόσπασμα κώδικα

χρήσεις Ping · ...
const
ADP_IP = '208.185.127.40'. (* http://delphi.about.com *)
αρχικά
Ping. Ping (ADP_IP) έπειτα ShowMessage ('Σχετικά με τον προγραμματισμό των Delphi!');
τέλος
;

Παράδειγμα 2: Πρόγραμμα Delphi με λειτουργία κονσόλας

Το επόμενο παράδειγμα είναι μια λειτουργία κονσόλας Πρόγραμμα Delphi που χρησιμοποιεί τη μονάδα Ping:. Εδώ είναι η πηγή της μονάδας Ping:

μονάδα Ping;
interfaceuses

Windows, SysUtils, Classes;
τύπος

TSunB = συσκευασμένο αρχείο
s_b1, s_b2, s_b3, s_b4: byte.
τέλος
;
TSunW = συσκευασμένο αρχείο
s_w1, s_w2: λέξη.
τέλος
;
PIPAddr = ^ TIPAddr;
TIPAddr = Ρεκόρ
υπόθεση
ακέραιος αριθμός του
0: (S_un_b: TSunB) · 1: (S_un_w: TSunW) · 2: (S_addr: longword) ·
τέλος
· IPAddr = TIPAddr.
λειτουργία
IcmpCreateFile: Thandle; stdcall; εξωτερικός 'icmp.dll';
λειτουργία
IcmpCloseHandle (icmpHandle: Thandle): boolean;
stdcall
; εξωτερικός 'icmp.dll'
λειτουργία
IcmpSendEcho
(IcmpHandle: Thandle; Διεύθυνση προορισμού: IPAddr;
RequestData: δείκτης; Αίτηση μεγέθους: Smallint;
Επιλογές αιτήσεων: δείκτης;
ReplyBuffer: δείκτης;
ΑπάντησηΑριθμός: DWORD;
Χρονικό όριο: DWORD): DWORD. stdcall; εξωτερικός 'icmp.dll';
λειτουργία
Ping (InetAddress: σειρά): boolean;
εφαρμογής

WinSock;
λειτουργία
Φέρω(var AInput: σειρά;
const
ADelim: σειρά = ' ';
const
ADelete: Boolean = true)
: σειρά;
var

iPos: Ακέραιος αριθμός;
ξεκινήσει
αν
ADelim = # 0 τότε αρχίστε
// AnsiPos δεν λειτουργεί με # 0

iPos: = Pos (ADelim, AInput);
τελειώστε αλλιώς

iPos: = Pos (ADelim, AInput);
τέλος
;
αν
iPos = 0 τότε αρχίστε
Αποτέλεσμα: = AInput;
αν
Απελευθερώστε τότε αρχίστε
AInput: = '';
τέλος
;
τελειώστε αλλιώς

αποτέλεσμα: = Αντιγραφή (AInput, 1, iPos - 1);
αν
Απελευθερώστε τότε αρχίστε
Διαγραφή (AInput, 1, iPos + Μήκος (ADelim) - 1).
τέλος
;
τέλος
;
τέλος
;
διαδικασία
TranslateStringToTInAddr (AIP: σειρά; var AInAddr);
var

phe: PHostEnt; pac: PChar; GInitData: TWSAData;
ξεκινήσει

WSAStartup ($ 101, GInitData).
δοκιμάστε

phe: = GetHostByName (PChar (AIP)).
αν
Ανατίθεται (phe) τότε αρχίζει
pac: = phe ^ .h_addr_list ^;
αν
Ανάθεση (pac) έπειτα
ξεκινήσει
με
TIPAddr (AInAddr) .S_un_b ξεκινήστε
s_b1: = Byte (pac [0]), s_b2: = Byte (pac [1]), s_b3: = Byte (pac [2]), s_b4: = Byte (pac [3]);
τέλος
;
τέλος
αλλού
ξεκινήσει
υψώνω
Εξαίρεση. Δημιουργία ('Σφάλμα κατά τη λήψη IP από HostName');
τέλος
;
τέλος
αλλού
ξεκινήσει
υψώνω
Εξαίρεση. Δημιουργία ('Error getting HostName');
τέλος
;
εκτός

FillChar (AInAddr, ΜέγεθοςOf (AInAddr), # 0);
τέλος
· WSACleanup;
τέλος
;
λειτουργία
Ping (InetAddress: σειρά): boolean;
var

Χειριστείτε: Thandle;
InAddr: IPAddr;
DW: DWORD;
μαλλομέταξο ύφασμα: πίνακας[1..128] του ψηφιόλεξη;
ξεκινήσει

αποτέλεσμα: = false; Χειριστείτε: = IcmpCreateFile;
αν
Χειριστείτε = INVALID_HANDLE_VALUE έπειτα
Εξοδος;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Handle, InAddr, μηδέν, 0, μηδέν, @rep, 128, 0), Αποτέλεσμα: = (DW 0), IcmpCloseHandle (Handle),
τέλος
;​
τέλος
.
instagram story viewer